티스토리 뷰

알고리즘/코테

[백준 2515] 전시장

kiwiiiv 2022. 12. 16. 16:38

https://www.acmicpc.net/problem/2515

 

2515번: 전시장

첫째 줄에는 그림의 개수 N (1 ≤ N ≤ 300,000)과 판매가능 그림을 정의하는 1이상의 정수 S가 빈칸을 사이에 두고 주어진다. 다음 이어지는 N개의 줄 각각에는 한 그림의 높이와 가격을 나타내는 정

www.acmicpc.net

dp를 적용하여 풀이할 수 있다.

문제에서 제시한 테스트케이스 1번을 통하여 생각해 보면

6 4
//그림 입력
15 80
8 230
10 100
17 200
20 75
26 80

 

위에서 입력된 그림들을 높이 asc, 비용 desc 기준으로 정렬하면 다음과 같다.

//sorted
8 230
10 100
15 80
17 200
20 75
26 80

 

높이가 제일 낮은 그림 (8,230)을 고르는 경우를 생각해 보면

두번째 그림의 높이는 10이므로 첫번째 그림과의 간격이 부족하여 선택할 수 없다. 따라서 높이가 15인 그림부터 선택할 수 있다

이런 과정을 그림을 통하여 생각하면 다음과 같다

 

위의 트리(?)에서, (15,80)을 선택하는 경우와 (17,200)을 선택하는 경우 두 가지로 나뉠 수 있다.

비용의 최대를 구하는 게 목적이므로, 두 경우의 총 합 중 더 큰 값을 가지는 (17,200)을 선택하여 (8,230)을 선택하는 경우의 최대를 갱신할 수 있다.

 

 

 

위의 과정을 쉬운 구현을 위해 

maxCost(dp array)를

maxCost[i] = 0~i 까지의 그림을 고려했을 때의 최대

로 정의하여 풀이함.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {

	static int N, S;
	static int[] maxCost;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input = br.readLine();
		N = Integer.parseInt(input.split(" ")[0]);
		S = Integer.parseInt(input.split(" ")[1]);

		int[][] arts = new int[N][2];
		for (int i = 0; i < N; i++) {
			arts[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
		}

		//높이 asc, 비용 desc
		Arrays.sort(arts, (o1, o2) -> {
			if (o1[0] == o2[0])
				return o2[1] - o1[1];
			return o1[0] - o2[0];
		});
		maxCost = new int[N];
		int[] sortedHeights = Arrays.stream(arts).mapToInt(i -> i[0]).toArray();
		//dp
		maxCost[0] = arts[0][1];
		for (int i = 1; i < N; i++) {
			int currHeight = arts[i][0];
			int currCost = arts[i][1];
			int findIdx = Arrays.binarySearch(sortedHeights, currHeight - S);
			if (findIdx != -1) {
				if (findIdx < 0) {
					findIdx = -(findIdx + 1) - 1;
				}
				maxCost[i] = maxCost[findIdx] + currCost;
			} else {
				maxCost[i] = currCost;
			}
			maxCost[i] = Math.max(maxCost[i - 1], maxCost[i]);
		}

		System.out.println(maxCost[maxCost.length - 1]);
	}
}

'알고리즘 > 코테' 카테고리의 다른 글

[프로그래머스 43236] 징검다리  (0) 2023.01.19
[백준 16235] 나무 재테크  (0) 2022.12.22
[백준 1240] 노드 사이의 거리  (0) 2022.12.09
[백준 9997] 폰트  (0) 2022.10.27
[백준 11404] 플로이드 (보충하기/)  (0) 2022.07.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함