https://school.programmers.co.kr/learn/courses/30/lessons/214288
ํ์ด๊ณผ์
1. ์ ํ ๋ณ ๋ฉํ ์ ์ซ์ ์กฐํฉ์ ๋ค ๊ตฌํ๊ธฐ (์์ ํ์)
1-1. ์ด๋ n์ ์ต๋ 20์ด๋ฉฐ k๋ ์ต๋ 5์ ๋๋ค. ์๋ ์ค๋ช ์ ์ ๋ฆฌ๋ฅผ ํด๋์๋๋ฐ n-1๊ฐ(19)์์ k-1๊ฐ(4)์ ์กฐํฉ์ ๋ฝ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ 3,876๊ฐ ์ ๋๋ค.
1-2. reqs์ ๊ธธ์ด๋ ์ต๋ 300์ด๋ฏ๋ก, ๋ชจ๋ ์กฐํฉ์์ ์ง์ฐ์๊ฐ์ ๊ณ์ฐํ๋ ๊ฒฝ์ฐ๋ 3876*300 =1,162,800 ์ ๋๋ค.
1-3. ์ฆ ์์ ํ์ ํด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
2. ์ฐ์ ์์ ํ๋ฅผ ํ์ฉํ์ฌ ์ง์ฐ์๊ฐ ๊ณ์ฐํ๊ธฐ
3. ์ต์๊ฐ ๊ฐฑ์ ํ๊ธฐ
์ค๋ช
์ ํ ๋ณ ๋ฉํ ์ ์ซ์ ์กฐํฉ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ
์) 5๋ช ์ ์๋ด์๊ณผ 3๊ฐ์ง์ ์๋ด์ ํ์ด ์๋ ๊ฒฝ์ฐ
- ๊ฒ์์ ์์ด ์๋ด์์ด๋ผ๊ณ ํ ๋, ํ๋์ ๋ง๋๊ธฐ๋ฅผ ๋์ ์ ์๋ ์์น (1๋ฒ~4๋ฒ) ์์ ๋ ๊ฐ๋ฅผ ์กฐํฉ(combination)ํ๋ ๊ฒฝ์ฐ ์ ๋๋ค.
- ์ฆ n,k๋ก ํํ์ ํ์๋ฉด 1~n-1์ ์ซ์ ์ค k-1๊ฐ์ ์กฐํฉ์ ๋ฝ๋ ๊ฒ ์ ๋๋ค.
์ ๊ทธ๋ฆผ์์ 1~4 ์ซ์ ์ค 2๊ฐ๋ฅผ ๋ฝ๋ ์กฐํฉ์ ๊ฒฝ์ฐ๋
1,2
1,3
1,4
2,3
2,4
3,4
์ด๋ฉฐ,
1,4์ ๊ฒฝ์ฐ๋ฅผ ํํํ๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์์ง๋๋ค.
์ฆ, 1๋ฒ ์ ํ์ 1๋ช 2๋ฒ ์ ํ์ 3๋ช 3๋ฒ ์ ํ์๋ 1๋ช ์ ๋ฐฐ์นํ๊ฒ ๋๋ ๊ฒ ์ ๋๋ค.
์ฝ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
...
int[] comb = new int[k-1]; // ์ค๋ช
์ ์ํด์ ๋ณ์๋ฅผ ๋ฐ์ผ๋ก ๋บ์
void solve(int cnt, int start){
if(cnt==k-1){
System.out.println(Arrays.toString(comb));
return;
}
for(int i=start;i<n;i++){
comb[cnt] = i;
solve(cnt+1,i+1);
}
}
...
- solveํจ์๋ฅผ ํตํด์ ์ฌ๊ท์ ์ผ๋ก(๋ฐฑํธ๋ํน? dfs?) ์์ ํ์ํฉ๋๋ค.
- cnt๋งค๊ฐ๋ณ์๋ก ํ์ฌ ์ ํ์ด ์๋ฃ๋ ๊ฐฏ์๋ฅผ ๋๊ฒจ์ฃผ๊ณ , start๋งค๊ฐ๋ณ์๋ก ๋ค์ ํ์ ์์น๋ฅผ ๊ฐฑ์ ํด์ค๋๋ค.
- solve(cnt+1, i+1) ์ฝ๋ ๋ค์ comb[cnt] = i๋ฅผ ์์๋ณต๊ตฌ ์์ผ์ฃผ๋ ์ฝ๋๋ ํ์๊ฐ ์์ต๋๋ค.
- ์๋ํ๋ฉด ๋ค์ ํ์ ๋ ํด๋น ์์น์ ์๋ก์ด ๊ฐ์ด ๋ฎ์ด์์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ์ ์์ ํ๋ฅผ ํ์ฉํ์ฌ ์ง์ฐ์๊ฐ ๊ณ์ฐํ๊ธฐ
๋ฌธ์ ์์ ์ฃผ์ด์ง ์์(1๋ฒ ์ ํ : 2๋ช , 2๋ฒ ์ ํ : 1๋ช , 3๋ฒ ์ ํ : 2๋ช )์์
1๋ฒ ์ ํ ์๋ด์ ์ง์ฐ ์๊ฐ์ ๊ณ์ฐํด๋ณด๊ฒ ์ต๋๋ค.
์ฐธ๊ฐ์ ๋ฒํธ | ์๊ฐ | ์๋ด ์๊ฐ | ์๋ด ์ ํ |
1๋ฒ ์ฐธ๊ฐ์ | 10๋ถ | 60๋ถ | 1๋ฒ ์ ํ |
3๋ฒ ์ฐธ๊ฐ์ | 20๋ถ | 30๋ถ | 1๋ฒ ์ ํ |
5๋ฒ ์ฐธ๊ฐ์ | 50๋ถ | 40๋ถ | 1๋ฒ ์ ํ |
7๋ฒ ์ฐธ๊ฐ์ | 65๋ถ | 30๋ถ | 1๋ฒ ์ ํ |
์ฐ์ ์์ ํ๋ฅผ ํ์ฉํ ๊ณ์ฐ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
0. ์ฐ์ ์์ ํ์ ์ด๊ธฐ ๊ฐ(0๋ถ)์ ๊ฐฏ์๋ ์์์ ๊ตฌํ ์ ํ ๋ณ ๋ฉํ ์ ์ซ์ ์กฐํฉ์ ๊ฒฐ๊ณผ๋ก ์ด๊ธฐํ๋ฅผ ์์ผ์ค์ผ ํฉ๋๋ค.
์ ์์์ ๊ฒฝ์ฐ
1๋ฒ ์ ํ์ ๋ฐฐ์น๋ ๋ฉํ ๋ 2๋ช ์ด๋ฏ๋ก ์ฐ์ ์์ ํ์ 0์ ๋ ๊ฐ ๋ฃ์ด์ ์ด๊ธฐํ๋ฅผ ์์ผ์ค๋๋ค.
2๋ฒ ์ ํ์ ๋ฐฐ์น๋ ๋ฉํ ๋ 1๋ช ์ด๋ฏ๋ก ์ฐ์ ์์ ํ์ 0์ ํ ๊ฐ ๋ฃ์ด์ ์ด๊ธฐํ๋ฅผ ์์ผ์ค๋๋ค.
3๋ฒ ์ ํ์ ๋ฐฐ์น๋ ๋ฉํ ๋ 2๋ช ์ด๋ฏ๋ก ์ฐ์ ์์ ํ์ 0์ ๋ ๊ฐ ๋ฃ์ด์ ์ด๊ธฐํ๋ฅผ ์์ผ์ค๋๋ค.
1. ์ด๊ธฐ ์ฐ์ ์์ ํ๋ 0์ด 2๊ฐ ๋ค์ด๊ฐ์๋๋ก ์ด๊ธฐํ ํฉ๋๋ค.
2. ์ต์๊ฐ์ pollFirst()ํ๋ฉด 0๋ถ์ด ๋์ต๋๋ค.
1๋ฒ ์ฐธ๊ฐ์์ ์๊ฐ 10๋ถ ๋ณด๋ค ์์ ๊ฐ์ด๋ฏ๋ก ์ง์ฐ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
3. 1๋ฒ ์ฐธ๊ฐ์์ ์๋ด์ด ๋๋ ์๊ฐ (10๋ถ + 60๋ถ)์ offerํด์ค๋๋ค.
4. ๋ค์ ์๋ด์ ์ํด ์ต์๊ฐ์ pollFirst()ํฉ๋๋ค.
0๋ถ์ 3๋ฒ ์ฐธ๊ฐ์์ ์๊ฐ 30๋ถ ๋ณด๋ค ์์ ๊ฐ์ด๋ฏ๋ก ์ง์ฐ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
5. 3๋ฒ ์ฐธ๊ฐ์์ ์๋ด์ด ๋๋ ์๊ฐ (20๋ถ + 30๋ถ)์ offerํด์ค๋๋ค.
6. ๋ค์ ์๋ด์ ์ํด ์ต์๊ฐ์ pollFirst()ํฉ๋๋ค.
50๋ถ์ 5๋ฒ ์ฐธ๊ฐ์์ ์๊ฐ 50๋ถ ๊ณผ ๊ฐ์ ๊ฐ์ด๋ฏ๋ก ์ง์ฐ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
7. 5๋ฒ ์ฐธ๊ฐ์์ ์๋ด์ด ๋๋ ์๊ฐ (50๋ถ + 40๋ถ)์ offerํด์ค๋๋ค.
8. ๋ค์ ์๋ด์ ์ํด ์ต์๊ฐ์ pollFirst()ํฉ๋๋ค.
70๋ถ์ 7๋ฒ ์ฐธ๊ฐ์์ ์๊ฐ 65๋ถ ๋ณด๋ค ํฐ ๊ฐ์ด๋ฏ๋ก ์ง์ฐ์ด ๋ฐ์ํฉ๋๋ค.
70๋ถ-65๋ถ=5๋ถ. ์ฆ 5๋ถ์ ์ง์ฐ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๋ชจ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌ์ต๋๋ค.
์ ์์์ ๊ฒฝ์ฐ ์ด 5๋ถ์ ์ง์ฐ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ ๋ฏ ์ฐ์ ์์ ํ๋ฅผ ํ์ฉํด์ ์ง์ฐ ์๊ฐ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
์๊ฒ๋ ์
- ์ ํ ๋ณ ํ ๋น๋ ์ธ์์ ๊ฐฏ์๋ฅผ ๊ตฌํ๋ ๋ถ๋ถ์ ์กฐํฉ์ ํตํด์ ๊ตฌํํ ์ ์์์ ์๊ฒ ๋์์ต๋๋ค. ์ด ๋ถ๋ถ์ด ์์ด๋ก๋ stars and bars์ธ ๊ฒ ๊ฐ์ต๋๋ค.
https://en.wikipedia.org/wiki/Stars_and_bars_(combinatorics)
- ์กฐํฉ์ ๊ตฌํ ๋ ์์๋ณต๊ตฌ ๋ก์ง์ด ํ์์์์ ๋ค์ ํ ๋ฒ ๊ณต๋ถํ ์ ์์์ต๋๋ค.
์ ์ฒด์ฝ๋
import java.util.*;
// 1. 1~n-1 ์ ์ซ์ ์ค k-1๊ฐ์ ์กฐํฉ์ ๋ฝ๊ธฐ
// 1-1. ๋ฝ์์ง ์กฐํฉ ์ซ์๋ค์ ์ฐจ์ด ๊ฐ์ ํตํด์ ์ ํ ๋ณ ๋ฉํ ์ ์ซ์๋ฅผ ๊ตฌํ๊ธฐ
// 2. ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํ์ผ๋ก PQ์ ์ด๊ธฐ ์์ ๊ฐฏ์ ์ค์
// 3. PQ๋ฅผ ํ์ฉํด์ ์ง์ฐ์๊ฐ ๋์ ํ๊ธฐ
// 4. ์ต์๊ฐ ๊ฐฑ์ ํ๊ธฐ
class Solution {
static final int INF = (int)1e9;
int[] comb;
int answer;
int k,n;
int[][] reqs;
PriorityQueue<Integer>[] pq;
int calc(){
int result = 0;
for(int[] req : reqs){
int a = req[0]; // a๋ถ์
int b = req[1]; // b๋ถ ๋์
int c = req[2]-1; // c์ ํ์ ์๋ด
int d = pq[c].poll(); // ํ์ฌ pq์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋๋๋ ์๋ด ์๊ฐ
if(d - a > 0){ // ๋๊ธฐํด์ผ ํ๋ฉด
result += (d - a);
pq[c].offer(d + b);
}else{ // ๋๊ธฐ ํ์ง ์์๋ ๋๋ฉด
pq[c].offer(a + b);
}
}
return result;
}
void solve(int cnt, int start){
if(cnt==k-1){
for(int i=0;i<k;i++){
pq[i] = new PriorityQueue<>();
}
// comb[0], comb[1], ... , comb[k-2]
for(int i=0;i<comb[0];i++){
pq[0].offer(0);
}
for(int i=1;i<k-1;i++){
for(int j=comb[i-1];j<comb[i];j++){
pq[i].offer(0);
}
}
for(int i=comb[k-2];i<n;i++){
pq[k-1].offer(0);
}
answer = Math.min(answer,calc()); // ์ต์๊ฐ ๊ฐฑ์
return;
}
for(int i=start;i<n;i++){
comb[cnt] = i;
solve(cnt+1,i+1);
}
}
public int solution(int k, int n, int[][] reqs) {
answer = INF;
this.k = k;
this.n = n;
this.reqs = reqs;
pq = new PriorityQueue[k];
if(k==1){ // k==1 ์ธ ๊ฒฝ์ฐ ์์ธ์ฒ๋ฆฌ
pq[0] = new PriorityQueue<>();
for(int i=0;i<n;i++){
pq[0].offer(0);
}
answer = Math.min(answer,calc());
return answer;
}
comb = new int[k-1];
solve(0,1);
return answer;
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[HSAT 4ํ ์ ๊ธฐ ์ฝ๋ฉ ์ธ์ฆํ๊ฐ ๊ธฐ์ถ] ํต๊ทผ๋ฒ์ค ์ถ๋ฐ ์์ ๊ฒ์ฆํ๊ธฐ (0) | 2024.06.28 |
---|---|
[HSAT 1ํ ์ ๊ธฐ ์ฝ๋ฉ ์ธ์ฆํ๊ฐ ๊ธฐ์ถ] ๋ก๋ด์ด ์ง๋๊ฐ ๊ฒฝ๋ก (0) | 2024.06.28 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ (0) | 2024.06.24 |
[PCCP ๊ธฐ์ถ๋ฌธ์ ] 2๋ฒ / ์์ ์์ถ (0) | 2024.04.30 |
์์ค์ ๊ธฐ์ฌ ๋๊ฒฐ(์ผ์ฑ sw์ญ๋ํ ์คํธ) (0) | 2024.04.12 |