https://www.acmicpc.net/problem/13904
13904번: 과제
예제에서 다섯 번째, 네 번째, 두 번째, 첫 번째, 일곱 번째 과제 순으로 수행하고, 세 번째, 여섯 번째 과제를 포기하면 185점을 얻을 수 있다.
www.acmicpc.net
문제
풀이
[마감일 , 점수] 쌍으로 여러 입력이 주어지는데 , 예제를 보자
[6 , 5] [4, 60] 의 경우 6일마감 과제는 4일차 때 수행할 수 있지만 , 4일마감 과제는 6일차 때 수행할 수 없다.
즉 , 마감일이 늦은 순으로 처리를 먼저 하되 그때 처리할 수 있는 과제 중에서 점수를 가장 많이 주는것을 해야한다.
결론적으로는 주어진 입력에 대해서
1. 마감일이 늦은 순으로 내림차순 정렬
2. 점수를 많이주는 순으로 내림차순 정렬
수행을 한 후에 반복문을 돌리면 끝.
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
32
33
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
ArrayList<int[]> list = new ArrayList<>();
for(int i=0;i<n;i++) // [0] : 기간 [1] : 점수
list.add(Arrays.stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt).toArray());
list.sort((o1, o2) -> o2[0]==o1[0] ? o2[1]-o1[1] : o2[0]-o1[0]);
int totalScore=0;
boolean[] check = new boolean[list.size()];
for(int period=list.get(0)[0] ; period>0; period--){
int[] maxScore = new int[2]; //[0] : 기간 [1] : 점수
for(int i=0;i<list.size();i++){
if(maxScore[1] < list.get(i)[1] && period <= list.get(i)[0] && !check[i]){
maxScore[1] = list.get(i)[1];
maxScore[0] = i;
}
}
totalScore+=maxScore[1];
check[maxScore[0]]=true;
}
System.out.println(totalScore);
}
}
|
cs |
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [11266] 단절점 JAVA (0) | 2021.10.31 |
---|---|
[BOJ] 백준 [11497] 통나무 건너뛰기JAVA (0) | 2021.10.30 |
[BOJ] 백준 [1092] 배JAVA (0) | 2021.10.28 |
[BOJ] 백준 [9576] 책 나눠주기JAVA (0) | 2021.10.28 |
[BOJ] 백준 [1202] 보석 도둑JAVA (0) | 2021.10.26 |