알고리즘(BOJ)/Gold

백준 - 과제 13904

ch.0 2023. 2. 21. 23:55


문제 분석

2차배열로 오름차순으로 정렬하고 시작했다.

가장 높은 수 부터 날짜를 하나씩 낮춰가면서 현재남은 날짜보다 높으면 더 해주면 된다.

5일동안진행하고

4 30

4 20

1 10

3 10

이 있다고 할때 

5일보다 같거나 큰건없으니 패스

4일보타 같거나 큰건 30,20 이 있으니 더 높은 30을 픽

3일보다 같거나 큰건 20,10 남아있으니 20을 픽

2일보다 같거나 큰건 10이 남아있으니 10을픽

1일보다 같거나 큰건 10이 남아있으니 10을픽

 

 

 

전체 소스

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int repeat = Integer.parseInt(br.readLine());
		int[][] array = new int[repeat][2];

		for (int i = 0; i < repeat; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			array[i][0] = Integer.parseInt(st.nextToken());
			array[i][1] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(array, Collections.reverseOrder((o1, o2) -> {
			if (o1[1] == o2[1]) {
				return Integer.compare(o1[0], o2[0]);
			} else {
				return Integer.compare(o1[1], o2[1]);
			}
		}));



		int day = repeat+1;
		int result = 0;
		boolean[] visited = new boolean[repeat];
		while (day > 1) {
			day--;
			int max = 0;
			int p = 0;
			boolean check = false;
			for (int i = 0; i < repeat; i++) {
				if (array[i][0] >= day && visited[i] == false) {

					if (max < array[i][1]) {
						max = array[i][1];
						p = i;
						check = true;
					}
				}
			}
			if (check) {
				visited[p] = true;
				result += max;
			}
			
		}
		System.out.println(result);
	}

}

 

 

 


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

 

13904번: 과제

예제에서 다섯 번째, 네 번째, 두 번째, 첫 번째, 일곱 번째 과제 순으로 수행하고, 세 번째, 여섯 번째 과제를 포기하면 185점을 얻을 수 있다.

www.acmicpc.net