https://www.acmicpc.net/problem/2618
๐ ์๋ฐ(Java)๋ก ํธ๋ ๊ฒฝ์ฐฐ์ฐจ - ๋ฐฑ์ค 2618 ๐๐
๋ ๊ฒฝ์ฐฐ์ฐจ์ ์ต์ ์ด๋ ๊ฑฐ๋ฆฌ + ์ด๋ ๊ฒฝ๋ก๊น์ง ๊ตฌํ๋ DP ๋ฌธ์
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 2618 - ๊ฒฝ์ฐฐ์ฐจ ๋ฌธ์ ๋
N × N ํฌ๊ธฐ์ ๋์์ ๊ฒฝ์ฐฐ์ฐจ 2๋๊ฐ ๋ฐฐ์น๋์ด ์๊ณ ,
์ฌ๋ฌ ์ฌ๊ฑด์ด ์์ฐจ์ ์ผ๋ก ๋ฐ์ํ ๋
๋ ๊ฒฝ์ฐฐ์ฐจ๊ฐ ์ด๋ป๊ฒ ์ฌ๊ฑด์ ๋ถ๋ดํด์
์ด ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ต์ํํ ์ ์๋์ง๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
- ๊ฒฝ์ฐฐ์ฐจ 1: ํญ์ (1,1) ์์น์์ ์์
- ๊ฒฝ์ฐฐ์ฐจ 2: ํญ์ (N,N) ์์น์์ ์์
- ๊ฐ ์ฌ๊ฑด์ ์ ํํ ํ ๋ฒ๋ง ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ,
- ๊ฐ ์ฌ๊ฑด์ ๊ฒฝ์ฐฐ์ฐจ 1 ๋๋ ๊ฒฝ์ฐฐ์ฐจ 2๊ฐ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๐ก ์์ ์ ๋ ฅ
6
3
3 5
5 5
2 3
๐ก ์์ ์ถ๋ ฅ
9
1
2
1
- ์ด ์ด๋๊ฑฐ๋ฆฌ: 9
- ๊ฐ ์ฌ๊ฑด์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐฐ์ฐจ ๋ฒํธ ์ถ๋ ฅ
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ 2์ฐจ์ DP (Memoization) ๋ฅผ ํ์ฉํ์ฌ
๋ชจ๋ ๊ฐ๋ฅํ ์ฌ๊ฑด ์ฒ๋ฆฌ ์กฐํฉ์ ํจ์จ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
โ๏ธ ํต์ฌ ์ค๊ณ
- police(i, j):j๋ฒ ์ฌ๊ฑด์ ๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌํ ๊ฒฝ์ฐฐ์ฐจ 2๊ฐ
- ๋จ์ ์ฌ๊ฑด์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋๋ ์ต์ ๊ฑฐ๋ฆฌ
- i๋ฒ ์ฌ๊ฑด์ ๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌํ ๊ฒฝ์ฐฐ์ฐจ 1๊ณผ
- dp[i][j]:
- ๊ฒฝ์ฐฐ์ฐจ1์ด i๋ฒ, ๊ฒฝ์ฐฐ์ฐจ2๊ฐ j๋ฒ๊น์ง ์ฒ๋ฆฌํ์ ๋์ ์ต์ ๊ฑฐ๋ฆฌ
- ๊ฒฝ๋ก ์ถ์ :์ญ์ผ๋ก ์ถ์ ํ์ฌ ์ถ๋ ฅ
- ์ค์ ๋ก ์ด๋ค ๊ฒฝ์ฐฐ์ฐจ๊ฐ ์ด๋ค ์ฌ๊ฑด์ ์ฒ๋ฆฌํ๋์ง๋ฅผ
๐น Java ์ฝ๋ ์ค๋ช
๐ ์ ๋ ฅ ์ฒ๋ฆฌ
line_num = Integer.parseInt(br.readLine());
event_num = Integer.parseInt(br.readLine());
for (int i = 1; i <= event_num; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
list[i][0] = Integer.parseInt(st.nextToken());
list[i][1] = Integer.parseInt(st.nextToken());
}
โ ์ฌ๊ฑด ์ ๋ณด๋ฅผ list[1] ~ list[event_num]์ ์ ์ฅ
๐ ๊ฑฐ๋ฆฌ ๊ณ์ฐ ํจ์
public static int getDistance(int from, int to, int police) {
...
return Math.abs(x1 - x2) + Math.abs(y1 - y2);
}
โ ๊ฒฝ์ฐฐ์ฐจ๊ฐ ํน์ ์ฌ๊ฑด์์ ๋ค์ ์ฌ๊ฑด๊น์ง ๊ฐ๋ ๋งจํดํผ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
๐ ํต์ฌ DP ๋ก์ง
public static int police(int one, int two) {
int next = Math.max(one, two) + 1;
if (next > event_num) return 0;
if (dp[one][two] != 0) return dp[one][two];
int move1 = police(next, two) + getDistance(one, next, 1);
int move2 = police(one, next) + getDistance(two, next, 2);
dp[one][two] = Math.min(move1, move2);
return dp[one][two];
}
โ ์ฌ๊ฑด์ ์์๋๋ก ์ฒ๋ฆฌํ๋ฉด์
โ ๋ค์ ์ฌ๊ฑด์ ๊ฒฝ์ฐฐ์ฐจ 1์ด ๋งก์์ง, ๊ฒฝ์ฐฐ์ฐจ 2๊ฐ ๋งก์์ง ์ ํ
โ ์ต์ ๊ฑฐ๋ฆฌ๋ก ๊ฐฑ์ ํ๋ฉฐ ๋ฉ๋ชจ์ด์ ์ด์
๐ ๊ฒฝ๋ก ์ถ์ ๋ก์ง
for (int i = 1; i <= event_num; i++) {
int dist1 = getDistance(one, i, 1);
int dist2 = getDistance(two, i, 2);
if (dp[i][two] + dist1 == dp[one][two]) {
System.out.println(1);
one = i;
} else {
System.out.println(2);
two = i;
}
}
โ DP ๊ฐ ์ญ์ถ์ ์ ํตํด
โ ์ด๋ค ๊ฒฝ์ฐฐ์ฐจ๊ฐ ๊ฐ ์ฌ๊ฑด์ ๋งก์๋์ง ์์ฐจ์ ์ผ๋ก ์ถ๋ ฅ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
- 2์ฐจ์ DP๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋๋
- ์ํ: (police1์ด ๋ง์ง๋ง์ผ๋ก ๋งก์ ์ฌ๊ฑด ๋ฒํธ, police2๊ฐ ๋ง์ง๋ง์ผ๋ก ๋งก์ ์ฌ๊ฑด ๋ฒํธ)
- ์ฌ๊ฑด์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ฌ๊ท ๊ตฌ์กฐ
- ๊ฒฝ๋ก ์ถ์ ๊น์ง ํฌํจ๋ ์ ํ์ ์ธ DP ์ญ์ถ์ ๋ฌธ์
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b11780. ํ๋ก์ด๋ 2 (0) | 2025.04.25 |
---|---|
b13913. ์๊ฐ์ด๋ 4 (0) | 2025.04.22 |
b14003. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 5 (0) | 2025.04.16 |
b14002. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 4 (0) | 2025.04.15 |
b12852. 1๋ก ๋ง๋ค๊ธฐ 2 (0) | 2025.04.14 |