[Algorithm] ๐Ÿ’Ž๋ฐฑ์ค€ 1202 ๋ณด์„๋„๋‘‘

HaJingJingยท2021๋…„ 8์›” 29์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
106/119

0. ๋ฌธ์ œ

์„ธ๊ณ„์ ์ธ ๋„๋‘‘ ์ƒ๋•์ด๋Š” ๋ณด์„์ ์„ ํ„ธ๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ๋‹ค.

์ƒ๋•์ด๊ฐ€ ํ„ธ ๋ณด์„์ ์—๋Š” ๋ณด์„์ด ์ด N๊ฐœ ์žˆ๋‹ค. ๊ฐ ๋ณด์„์€ ๋ฌด๊ฒŒ Mi์™€ ๊ฐ€๊ฒฉ Vi๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ƒ๋•์ด๋Š” ๊ฐ€๋ฐฉ์„ K๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ฐ ๊ฐ€๋ฐฉ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋Š” Ci์ด๋‹ค. ๊ฐ€๋ฐฉ์—๋Š” ์ตœ๋Œ€ ํ•œ ๊ฐœ์˜ ๋ณด์„๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

์ƒ๋•์ด๊ฐ€ ํ›”์น  ์ˆ˜ ์žˆ๋Š” ๋ณด์„์˜ ์ตœ๋Œ€ ๊ฐ€๊ฒฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— N๊ณผ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N, K โ‰ค 300,000)

๋‹ค์Œ N๊ฐœ ์ค„์—๋Š” ๊ฐ ๋ณด์„์˜ ์ •๋ณด Mi์™€ Vi๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (0 โ‰ค Mi, Vi โ‰ค 1,000,000)

๋‹ค์Œ K๊ฐœ ์ค„์—๋Š” ๊ฐ€๋ฐฉ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ Ci๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค Ci โ‰ค 100,000,000)

๋ชจ๋“  ์ˆซ์ž๋Š” ์–‘์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ์ƒ๋•์ด๊ฐ€ ํ›”์น  ์ˆ˜ ์žˆ๋Š” ๋ณด์„ ๊ฐ€๊ฒฉ์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก ๋ฌด๊ฒŒ๊ฐ’์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœํ•œ ํ›„, ๋ฌด๊ฒŒ๊ฐ€ ๊ฐ™๋‹ค๋ฉด value๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ํ•จ
๐Ÿ’ก ๊ฐ€๋ฐฉ์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•จ
๐Ÿ’ก ๊ฐ€๋ฐฉ๋ณด๋‹ค ์ž‘์€ ๋ฌด๊ฒŒ๋ฅผ ๊ฐ€์ง„ ๋ณด์„๋“ค์„ ๋ชจ๋‘ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์Œ
๐Ÿ’ก ๊ฐ€๋ฐฉ ํ•˜๋‚˜์— ํ•œ ๊ฐœ ๋ณด์„์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์€ ๊ฒƒ ์ค‘์— ๊ฐ€๋ฐฉ ๊ฐœ์ˆ˜๋งŒํผ ๋ณด์„์„ ๊บผ๋‚ด์„œ ๋”ํ•จ

2. ํ•ต์‹ฌ ํ’€์ด

  1. ๋ฌด๊ฒŒ๊ฐ’์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœํ•œ ํ›„, ๋ฌด๊ฒŒ๊ฐ€ ๊ฐ™๋‹ค๋ฉด value๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ํ•จ
Arrays.sort(jewelry, new Comparator<int[]>() {
	@Override
	public int compare(int o1[], int o2[]) {
		if(o1[0] == o2[0]) return o2[1] - o1[1];
		return o1[0] - o2[0];
	}
});
  1. ๊ฐ€๋ฐฉ์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•จ
Arrays.sort(backpack);
  1. ๊ฐ€๋ฐฉ๋ณด๋‹ค ์ž‘์€ ๋ฌด๊ฒŒ๋ฅผ ๊ฐ€์ง„ ๋ณด์„๋“ค์„ ๋ชจ๋‘ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์Œ
for(int i=0; i<k; i++) {
	while(idx < n && jewelry[idx][0] <= backpack[i]) {
		pq.add((-1)*jewelry[idx][1]);
		idx++;
	}
...
}
  1. ๊ฐ€๋ฐฉ ํ•˜๋‚˜์— ํ•œ ๊ฐœ ๋ณด์„์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์€ ๊ฒƒ ์ค‘์— ๊ฐ€๋ฐฉ ๊ฐœ์ˆ˜๋งŒํผ ๋ณด์„์„ ๊บผ๋‚ด์„œ ๋”ํ•จ
for(int i=0; i<k; i++) {
	...
	if(!pq.isEmpty()) {
		cnt += Math.abs(pq.poll());
	}
}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.io.InputStreamReader;

public class BOJ_1202 {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] s = br.readLine().split(" ");
		
		int n = Integer.parseInt(s[0]);
		int k = Integer.parseInt(s[1]);
		
		int[][] jewelry = new int[n][2];
		int[] backpack = new int[k];
		
		for(int i=0; i<n; i++) {
			s = br.readLine().split(" ");
			jewelry[i][0] = Integer.parseInt(s[0]);
			jewelry[i][1] = Integer.parseInt(s[1]);
		}
		
		for(int i=0; i<k; i++) {
			backpack[i] = Integer.parseInt(br.readLine().trim());
		}
		
		Arrays.sort(jewelry, new Comparator<int[]>() {
			@Override
			public int compare(int o1[], int o2[]) {
				if(o1[0] == o2[0]) return o2[1] - o1[1];
				return o1[0] - o2[0];
			}
		});
		
		Arrays.sort(backpack);
		
		PriorityQueue<Integer> pq = new PriorityQueue<>();
		
		long cnt = 0;
		int idx = 0;
		
		for(int i=0; i<k; i++) {
			while(idx < n && jewelry[idx][0] <= backpack[i]) {
				pq.add((-1)*jewelry[idx][1]);
				idx++;
			}
			
			if(!pq.isEmpty()) {
				cnt += Math.abs(pq.poll());
			}
		}
		
		System.out.println(cnt);
	}

}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€