๋ฌธ์ (์ถ์ฒ: 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์ ํตํด ํ์ธํด์ ๊ฐ์ด ๋ด๋ณด๋)
: ๊ณ์ฐ๋๊ฐ ๋น์ด์๋์ง ํ์ธ ํ ๊ณ ๊ฐ์ ๊ณ์ฐ๋๋ก ๋ณด๋
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 22252_์ ๋ณด ์์ธ ํธ์ (0) | 2023.07.21 |
---|---|
[Baekjoon] 19640_ํ์ฅ์ค์ ๊ท์น (0) | 2023.07.20 |
[Baekjoon] 2696_์ค์๊ฐ ๊ตฌํ๊ธฐ (0) | 2023.07.19 |
[Baekjoon] 1655_๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ (0) | 2023.07.19 |
[Baekjoon] 14235_ํฌ๋ฆฌ์ค๋ง์ค ์ ๋ฌผ (0) | 2023.07.19 |