티스토리 뷰
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
링크
TAG
- 분할정복
- Knapsack
- 동적계획법
- 이분탐색
- 희소 배열
- 분할 정복
- Priority Queue
- 배낭 문제
- 위상 정렬
- dp
- 최단 거리
- LowerBound
- RequiredArgsConstructor
- 비트마스킹
- HashSet
- 구간 합
- 완전 탐색
- Greedy
- 부분 합
- 누적 합
- 백트래킹
- MaxHeap
- 페르마의 정리
- dfs
- prirotyqueue
- MinHeap
- 참조 지역성
- Segment Tree
- Sort
- 완전탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함