๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 17612_์‡ผํ•‘๋ชฐ

๋ฟŒ์•ผ._. 2023. 7. 20. 10:14

Gold II

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/17612)

< ์‡ผํ•‘๋ชฐ >

 

๋ฌธ์ œ ํ’€์ด 

 

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

์ด ๋ฌธ์ œ์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๊ณ„์‚ฐ์„ ๋งˆ์นœ ๊ณ ๊ฐ์˜ ์‹œ๊ฐ„์ด ๋™์ผํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

1) ๊ณ„์‚ฐ๋Œ€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋†’์€ ๊ณ ๊ฐ์ด ๋จผ์ € ๋‚˜๊ฐ

2) ๊ทธ๋‹ค์Œ ๊ณ ๊ฐ์€ ๊ณ„์‚ฐ๋Œ€์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ณณ์œผ๋กœ ๊ฐ

 

์œ„์™€ ๊ฐ™์€ ์กฐ๊ฑด์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ [์‹œ๊ฐ„, ๊ณ„์‚ฐ๋Œ€ ๋ฒˆํ˜ธ, ํšŒ์› ๋ฒˆํ˜ธ]๋กœ ์ €์žฅํ•˜๋ฉด์„œ ์‹œ๊ฐ„์ด ์ ์€ ์ˆœ+ ๊ณ„์‚ฐ๋Œ€ ๋ฒˆํ˜ธ๊ฐ€ ํฐ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋„๋ก ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์‹œ๊ฐ„์€ ์•ž์— ์‚ฌ๋žŒ์ด ๋งˆ์นœ ์‹œ๊ฐ„ + ๊ณ ๊ฐ์ด ๊ตฌ์ž…ํ•œ ๋ฌผ๊ฑด์˜ ์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค. ๊ณ ๊ฐ์˜ ๋ฌผ๊ฑด์˜ ์ˆ˜๋กœ๋งŒ ํ•œ๋‹ค๋ฉด ์–ธ์ œ ๊ณ„์‚ฐ์„ ์‹œ์ž‘ํ•ด์„œ ์–ธ์ œ ๋๋‚˜๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ฌธ์ œ์—์„œ ์ถœ๋ ฅ๊ฐ’์ด int ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ์— ์œ ์˜ํ•˜๋ผ ํ–ˆ์œผ๋ฏ€๋กœ ์ถœ๋ ฅ๊ฐ’์„ ๊ตฌํ•ด์ค„ ๋•Œ๋Š” long ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ๊ณ„์‚ฐํ•ด์„œ ๋”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class _17612_ { // ์‡ผํ•‘๋ชฐ

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());

		// ๊ณ ๊ฐ ์ˆ˜, ๊ณ„์‚ฐ๋Œ€ ์ˆ˜
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());

		PriorityQueue<int[]> queue = new PriorityQueue<>(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];
			}
		});

		int idx = 0;
		int r = 1;
		long result = 0;

		boolean arr[] = new boolean[k];
		int i = 0;
		boolean flag = false;

		while (i < n) {
			// ๊ณ ๊ฐ ์ •๋ณด
			st = new StringTokenizer(bf.readLine());
			i += 1;
			int id = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());

			// ์•„์ง ๊ณ„์‚ฐ๋Œ€๊ฐ€ ๋น„์–ด์žˆ์Œ
			if (queue.size() < k) {
				queue.add(new int[] { w, idx, id });
				arr[idx] = true;
				idx += 1;
			}

			// ๋น„์–ด์žˆ๋Š” ๊ณณ์ด ์—†์Œ
			else {
				int temp[] = queue.poll();
				result += new Long(temp[2]) * new Long(r);
				r += 1;
				arr[temp[1]] = false;
				flag = false;
                
                // ๊ณ„์‚ฐ์„ ๋งˆ์นœ ๊ณ ๊ฐ์˜ ์‹œ๊ฐ„์ด ๋™์ผ
				while (queue.size() > 0 && queue.peek()[0] == temp[0]) {
					temp = queue.poll();
					result += new Long(temp[2]) * new Long(r);
					r += 1;
					arr[temp[1]] = false;
				}
                
                // ๊ณ„์‚ฐ๋Œ€์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ณณ๋ถ€ํ„ฐ ์ฑ„์›Œ์คŒ
				for (int j = 0; j < k; j++) {
					if (!arr[j]) {
						if (flag) {
							st = new StringTokenizer(bf.readLine());
							i += 1;
							id = Integer.parseInt(st.nextToken());
							w = Integer.parseInt(st.nextToken());
						}
						queue.add(new int[] { w + temp[0], j, id });
						arr[j] = true;
						flag = true;
						if (i == n)
							break;
					}
				}
			}
		}

		while (!queue.isEmpty()) {
			int temp[] = queue.poll();
			result += new Long(temp[2]) * new Long(r);
			r += 1;
		}
		System.out.println(result);
	}
}

 

Main

๋ณ€์ˆ˜)
n : ๊ณ ๊ฐ ์ˆ˜
k : ๊ณ„์‚ฐ๋Œ€ ์ˆ˜
queue : [์‹œ๊ฐ„, ๊ณ„์‚ฐ๋Œ€ ๋ฒˆํ˜ธ, ๊ณ ๊ฐ์˜ ํšŒ์›๋ฒˆํ˜ธ] / ์‹œ๊ฐ„ ์˜ค๋ฆ„์ฐจ์ˆœ + ๊ณ„์‚ฐ๋Œ€ ๋ฒˆํ˜ธ ๋‚ด๋ฆผ์ฐจ์ˆœ 
idx : ๊ณ„์‚ฐ๋Œ€ ๋ฒˆํ˜ธ
r : ์‡ผํ•‘๋ชฐ์„ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์ˆœ์„œ
result : ์ถœ๋ ฅ๊ฐ’
arr : ๊ณ„์‚ฐ๋Œ€ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
i : ํšŒ์› ์ˆ˜ count
flag : ๊ณ ๊ฐ์˜ ์ •๋ณด๋ฅผ ๋” ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ•˜๋Š”๊ฐ€ ํ™•์ธ ์—ฌ๋ถ€
id : ๊ณ ๊ฐ์˜ ํšŒ์›๋ฒˆํ˜ธ
w : ๊ณ ๊ฐ์ด ๊ตฌ๋งคํ•œ ๋ฌผ๊ฑด์˜ ์ˆ˜

 

- ๊ณ ๊ฐ ์ˆ˜(n)์™€ ๊ณ„์‚ฐ๋Œ€ ์ˆ˜(k) ์ž…๋ ฅ

- ๊ณ ๊ฐ ์ •๋ณด ์ž…๋ ฅ๋ฐ›์Œ

1) ์•„์ง ๊ณ„์‚ฐ๋Œ€ ์ˆ˜๋งŒํผ ๊ณ ๊ฐ์ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด queue์— ์ถ”๊ฐ€

2) ๊ณ„์‚ฐ๋Œ€๊ฐ€ ๊ฝ‰ ์ฐผ๋‹ค๋ฉด

: ์‹œ๊ฐ„์ด ์ œ์ผ ์ž‘์€ ๊ณ ๊ฐ์„ ๋‚ด๋ณด๋ƒ„ (๊ณ„์‚ฐ์ด ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ queue.peek์„ ํ†ตํ•ด ํ™•์ธํ•ด์„œ ๊ฐ™์ด ๋‚ด๋ณด๋ƒ„)

: ๊ณ„์‚ฐ๋Œ€๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ ํ›„ ๊ณ ๊ฐ์„ ๊ณ„์‚ฐ๋Œ€๋กœ ๋ณด๋ƒ„