์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- PriorityQueue
- ์๋ฎฌ๋ ์ด์
- ํธ๋ผ์ด
- dfs
- Dijkstra
- ์์ด
- ์ด๋ถํ์
- ํ์๊ฐ์
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- ๋นํธ๋ง์คํน
- ๊ทธ๋ฆฌ๋
- ์นด์นด์ค
- ์ด์งํธ๋ฆฌ
- Django
- dp
- ํฌํฌ์ธํฐ
- ์ฐ์ ์์ํ
- ์ฌ๊ท
- ๊ตฌํ
- ํ๋ก์ด๋์์
- ๋ถ๋ถ์งํฉ
- ์๋ฃ๊ตฌ์กฐ
- BFS
- upperbound
- Floyd
- ๋ฐฑํธ๋ํน
- LowerBound
- Union Find
- ๋ค์ต์คํธ๋ผ
- ์กฐํฉ
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 1943 ๋์ ๋ถ๋ฐฐ ๋ณธ๋ฌธ
https://www.acmicpc.net/problem/1943
1943๋ฒ: ๋์ ๋ถ๋ฐฐ
์ธ ๊ฐ์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ๋์ ์ ์ข ๋ฅ N(1 ≤ N ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ ฅ์ ๋์งธ ์ค๋ถํฐ N+1์งธ ์ค๊น์ง ๊ฐ๊ฐ์ ๋์ ์ ๊ธ์ก๊ณผ ๊ฐ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋จ, ์
www.acmicpc.net
๋ฌธ์
์คํ์ ์คํฌ๋ ์์ ์๋ฒํ์ฌ ์ฐ๋ ๊ธฐ๋ฅผ ์ค๋ ์ฐฉํ ์ผ์ ํ์๋ค. ์์ฅ์ ์๋๊ป์๋ ์คํ์ ์คํฌ๋ฅผ ์นญ์ฐฌํ์๊ณ ๊ณผ์๋ ์ฌ ๋จน์ผ๋ผ๊ณ ํ์๋ฉฐ ๋์ ๋ช ๊ฐ๋ฅผ ์คํ์ ์คํฌ์๊ฒ ๊ฑด๋ค ์ฃผ์๋ค.
๊ทธ๋ฐ๋ฐ ๋์ ๋ฐ์ ์คํ์ ์คํฌ๋ ์ข์ํ๊ธฐ๋ณด๋ค ๊ณ ๋ฏผ์ ๋น ์ง๊ณ ๋ง์๋ค. ์์ฅ์ ์๋๊ป ๋ฐ์ ์ด ๋์ ์ด๋ป๊ฒ ๋๋์ด ํ ์ง ๊ณ ๋ฏผ์ ๋น ์ง ๊ฒ์ด๋ค. ๋ ์ฌ๋ ๋ชจ๋ ์๋๋ฐฉ์ด ์๊ธฐ๋ณด๋ค 1์์ด๋ผ๋ ๋ ๋ฐ๋ ๊ฒ์ ๋์ ํ ์ธ์ ํ ์ ์์ด ํ๋ค. ๋ฐ๋ผ์ ๋์ ๋๊ฐ์ด ๋๋ก ๋๋์ด ๊ฐ์ ธ์ผ ๋ ์ฌ๋์ด ๋ชจ๋ ๋ง์กฑํ ์ ์๊ฒ ๋๋ค.
ํ์ง๋ง ๋ ์ฌ๋์๊ฒ ๋์ ๋๊ฐ์ด ๋๋๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ์๋ค. ์๋ฅผ ๋ค์ด 500์์ง๋ฆฌ 1๊ฐ์ 50์์ง๋ฆฌ 1๊ฐ๋ฅผ ๋ฐ์๋ค๋ฉด, ์ด ๋์ ๋ ์ฌ๋์ด ๋๊ฐ์ด ๋๋์ด ๊ฐ์ง ์๋ ์๋ค. ๋ฌผ๋ก ๋์ ์ ๋ฐ์ผ๋ก ์๋ผ์ ๋๋์ด ๊ฐ์ง ์๋ ์๊ฒ ์ง๋ง ๊ทธ๋ฌ๋ฉด ๋์ผ๋ก์์ ๊ฐ์น๋ฅผ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ ์๋ ์๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค. ์์ฅ ์ ์๋๊ป์ N๊ฐ์ง ์ข ๋ฅ์ ๋์ ์ ๊ฐ๊ฐ ๋ช ๊ฐ์ฉ ์ฃผ์ จ์ ๋, ๊ทธ ๋์ ๋ฐ์ผ๋ก ๋๋ ์ ์๋์ง ์๋์ง ํ๋จํ๋ ๊ฒ์ด๋ค.
์ ๋ ฅ
์ธ ๊ฐ์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ๋์ ์ ์ข ๋ฅ N(1 ≤ N ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ ฅ์ ๋์งธ ์ค๋ถํฐ N+1์งธ ์ค๊น์ง ๊ฐ๊ฐ์ ๋์ ์ ๊ธ์ก๊ณผ ๊ฐ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋จ, ์์ฅ์ ์๋๊ป์ ์ฃผ์ ๊ธ์ก์ ์ด ํฉ์ 100,000์์ ๋์ง ์๋๋ค. ๋์ ์ ๊ธ์ก๊ณผ ๊ฐ์๋ ์์ฐ์์ด๊ณ , ๊ฐ์ ๊ธ์ก์ ๊ฐ์ง ๋์ ์ด ๋ ๋ฒ ์ด์ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ ์ธ ์ค์ ๊ฑธ์ณ, ๊ฐ ์ ๋ ฅ์ ๋ํ์ฌ ๋ฐ์ผ๋ก ๋๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉด 1, ๋ถ๊ฐ๋ฅํ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
๐ก ๊ฐ์ ์
1. sum์ด ํ์์ธ ๊ฒฝ์ฐ ์ ํํ๊ฒ ๋ฐ์ผ๋ก ๋๋ ์ ์๋ค. ์ด๊ฒ์ dp๋ฅผ ๊ฐฑ์ ํ ๋ค ์ฒดํฌํ๊ฒ ๋๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
2. 50000๊น์ง๋ง ๊ฒ์ฌํ์! → ์ด์ฐจํผ ํฉ์ 100000์ ๋์ง ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ค๊ฐ ๊ฐ์ 50000์ ๋์ง ์๊ณ ์ฐ๋ฆฌ๋ ์ค๊ฐ๊ฐ์ด ๊ฐ๋ฅํ์ง๋ง ๊ฒ์ฌํ๋ฉด ๋๋ค.
3. ์ด์ฐจ์ DP๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ ์ผ์ฐจ์์ ์ฌ์ฉํ์ฌ ๋ค์์๋ถํฐ ๊ฐฑ์ ํด์ค๋ค.
4. int dp๋ง๊ณ boolean์ ์ฌ์ฉํ์ฌ ๊ทธ ๊ฐ์น์ ๊ฐ์ ๋ง๋ค์ ์๋์ง๋ง ๊ณ ๋ คํ๋ค.
์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class BOJ_1943 {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
for(int t=0; t<3; t++) {
boolean[] d = new boolean[50001];
ArrayDeque<int[]> coins = new ArrayDeque<>();
d[0] = true;
int sum = 0;
int N = Integer.parseInt(bf.readLine());
for(int u =0; u<N; u++) {
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
int coin = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(st.nextToken());
sum += num * coin;
for(int k = coin; k<=num*coin && k<=50000; k+=coin) {
d[k] = true;
}
coins.offer(new int[] {coin, num, sum});
}
if(sum % 2 == 1) sb.append(0).append("\\n");
else if(d[sum/2]) sb.append(1).append("\\n");
else {
while(!coins.isEmpty()) {
int[] now = coins.poll();
if(now[2] > 50000) now[2] = 50000;
for(int i=0; i<now[1]; i++) {
for(int j=now[2]; j>now[0]; j--) {
if((j-now[0]) % now[0] == 0 && (j-now[0]) <= now[0]*now[1]) continue;
d[j] |= d[j-now[0]];
}
}
}
if(sum % 2 == 0 && d[sum/2]) sb.append(1).append("\\n");
else sb.append(0).append("\\n");
}
}
System.out.println(sb);
}
}
ํ ์ค ์ฉ ์ดํด๋ณด์!
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
for(int t=0; t<3; t++) {
boolean[] d = new boolean[50001];
ArrayDeque<int[]> coins = new ArrayDeque<>();
d[0] = true;
int sum = 0;
int N = Integer.parseInt(bf.readLine());
์ธ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก FOR๋ฌธ์ ์ธ๋ฒ ๋๋ฆฐ๋ค.
์ฌ์ฉํ dp๋ฅผ ์ ์ธํ๋ค.
ArrayDeque์ ์ด์ฉํ์ฌ ๋์ ์ ๊ฐ์น์ ๊ฐ์, ์ฌํ์ ํฉ์ ๋ฃ์ด์ค๋ค.
0์์ ์ธ์ ๋ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ true๋ก ๋ฐ๊ฟ์ค๋ค.
for(int u =0; u<N; u++) {
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
int coin = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(st.nextToken());
sum += num * coin;
for(int k = coin; k<=num*coin && k<=50000; k+=coin) {
d[k] = true;
}
coins.offer(new int[] {coin, num, sum});
}
์ฌ์ฉํ ๋์ ์ข ๋ฅ N๊ฐ๋ฅผ ์ ๋ ฅ ๋ฐ์์ฃผ๊ณ coins์ ๋ฃ์ด์ค๋ค.
์ด๋ dp๋ฅผ 1์ฐจ ๊ฐฑ์ ํด์ฃผ๋๋ฐ ์ ๋ ฅ๋ฐ์ ๋์ ์ผ๋ก ๊ฐ๋ฅํ ๊ฐ์น๋ง! true๋ก ๋ฐ๊พธ์ด์ค๋ค.
50000๊น์ง๋ง ๊ฒ์ฌํ๊ธฐ๋ก ํ์๊ธฐ์ ์ ํ ์กฐ๊ฑด์ ๋ฃ๋๋ค.(์์ผ๋ฉด ArrayIndexOutOfBounds๊ฐ ๋ ๊ฒ์ด๋ค.)
if(sum % 2 == 1) sb.append(0).append("\\n");
else if(d[sum/2]) sb.append(1).append("\\n");
sum์ด ํ ์ ์ธ ๊ฒฝ์ฐ๋ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ด๊ณ ์ฌํ์ ๊ฐฑ์ ์ผ๋ก ๋ง๋ค์ ์๋ ๊ฐ๊ฒฉ์ด๋ฉด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ด๋ฉด 1์ ์ถ๋ ฅํ๋ค.
else {
while(!coins.isEmpty()) {
int[] now = coins.poll();
if(now[2] > 50000) now[2] = 50000;
for(int i=0; i<now[1]; i++) {
for(int j=now[2]; j>now[0]; j--) {
if((j-now[0]) % now[0] == 0 && (j-now[0]) <= now[0]*now[1]) continue;
d[j] |= d[j-now[0]];
}
}
}
if(d[sum/2]) sb.append(1).append("\\n");
else sb.append(0).append("\\n");
}
}
coins์ ๋ฃ์ด์๋ ๋์ ๋ค์ ๊บผ๋ด์ dp๋ฅผ ๊ฐฑ์ ํ๋ค.
๋จผ์ ๋ฐ์์ค sum์ด 50000์ด์์ด๋ฉด 50000๋ถํฐ๋ง ๊ฒ์ฌํ ์ ์๊ฒ ๋ฐ๊พธ์ด์ค๋ค. ์ด๋ sum/2์ผ๋ก ๋ฐ๊พธ์ด์ฃผ์ด๋ ๋๋ค.
์ด์ค for๋ฌธ์ ํตํด ๊ฐ์ ์ข ๋ฅ์ด ๋์ ์ “๊ฐ๊ฐ” ์ดํด dp๋ฅผ ๊ฐฑ์ ํ ๊ฒ์ด๋ค. ์ด๋ 1์ฐจ dp ๊ฐฑ์ ๊ณผ ์ค๋ณต๋์ง ๋ง์์ผํ๋ฏ๋ก if๋ฌธ์ ์กฐ๊ฑด์ ํตํด ์ ํ์ ์ค๋ค.
d[j-coin]์ ๊ฐ์ด true์ด๋ฉด d[j]๋ true๊ฐ ๋๋๋ก or๋ฅผ ์ด์ฉํด์ค๋ค.
sum/2๋ฅผ ์ดํด ์ถ๋ ฅ์ ์ ํด์ค๋ค.
4๊ฐ์ง์ ๊ฐ์ ์ ํตํด ์๊ฐ ์ด๊ณผ๊ฐ ๋๊ณ ์๋ฌ๊ฐ ๋๋ ๋ฌธ์ ๋ฅผ ํ ์ ์์๋ค…!
'๐ Problem Solving > ๐ BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 4811 ์์ฝ (0) | 2023.03.28 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 1654 ๋์ ์๋ฅด๊ธฐ (0) | 2023.02.27 |
[JAVA] BOJ ๋ฐฑ์ค 2110 ๊ณต์ ๊ธฐ ์ค์น (0) | 2023.02.27 |
[JAVA] BOJ ๋ฐฑ์ค 2343 ๊ธฐํ ๋ ์จ (0) | 2023.02.27 |
[JAVA] BOJ ๋ฐฑ์ค 2805 ๋๋ฌด์๋ฅด๊ธฐ (0) | 2023.02.27 |