๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/17485
โธ ๋ฌธ์
์ฐ์ฃผ๋นํ์ด ๊ฟ์ด์๋ ์ง์ฐ๋ ์์์ '๋งค์ผ๋งค์ผ์ฑ์ฑ'์์ ์ด์ฌํ ์ผํ ๊ฒฐ๊ณผ ๋ฌ ์ฌํ์ ํ์ํ ์๊ธ์ ๋ชจ๋ ๋ง๋ จํ์๋ค! ์ง๊ตฌ์ ์ฐ์ฃผ์ฌ์ด๋ N X M ํ๋ ฌ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ ๊ฐ ์์์ ๊ฐ์ ์ฐ์ฃผ์ ์ด ๊ทธ ๊ณต๊ฐ์ ์ง๋ ๋ ์๋ชจ๋๋ ์ฐ๋ฃ์ ์์ด๋ค.
์ง์ฐ๋ ์ฌํ๊ฒฝ๋น๋ฅผ ์๋ผ๊ธฐ ์ํด ์กฐ๊ธ ํน์ดํ ์ฐ์ฃผ์ ์ ์ ํํ์๋ค. ์ง์ฐ๊ฐ ์ ํํ ์ฐ์ฃผ์ ์ ํน์ง์ ์๋์ ๊ฐ๋ค.
1. ์ง๊ตฌ -> ๋ฌ๋ก ๊ฐ๋ ๊ฒฝ์ฐ ์ฐ์ฃผ์ ์ด ์์ง์ผ ์ ์๋ ๋ฐฉํฅ์ ์๋์ ๊ฐ๋ค.
2. ์ฐ์ฃผ์ ์ ์ ์ ์์ง์ธ ๋ฐฉํฅ์ผ๋ก ์์ง์ผ ์ ์๋ค. ์ฆ, ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋๋ฒ ์ฐ์์ผ๋ก ์์ง์ผ ์ ์๋ค.
์ง์ฐ์ ๋ชฉํ๋ ์ฐ๋ฃ๋ฅผ ์ต๋ํ ์๋ผ๋ฉฐ ์ง๊ตฌ์ ์ด๋์์น์์๋ ์ถ๋ฐํ์ฌ ๋ฌ์ ์ด๋์์น๋ ์ฐฉ๋ฅํ๋ ๊ฒ์ด๋ค.
์ต๋ํ ๋์ ์๋ผ๊ณ ์ด์์ ๋ฌ์ ๋์ฐฉํ๊ณ ์ถ์ ์ง์ฐ๋ฅผ ์ํด ๋ฌ์ ๋๋ฌํ๊ธฐ ์ํด ํ์ํ ์ฐ๋ฃ์ ์ต์๊ฐ์ ๊ณ์ฐํด ์ฃผ์.
โธ ์ ๋ ฅ
์ฒซ์ค์ ์ง๊ตฌ์ ๋ฌ ์ฌ์ด ๊ณต๊ฐ์ ๋ํ๋ด๋ ํ๋ ฌ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ N, M (2 ≤ N, M ≤ 1000)์ด ์ฃผ์ด์ง๋ค.
๋ค์ N์ค ๋์ ๊ฐ ํ๋ ฌ์ ์์ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ํ๋ ฌ์ ์์๊ฐ์ 100 ์ดํ์ ์์ฐ์์ด๋ค.
โธ ์ถ๋ ฅ
๋ฌ ์ฌํ์ ํ์ํ ์ต์ ์ฐ๋ฃ์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 5
- ๐ ๋ฌธ์ ์ ํ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ ์ด์ ์ด๋ ๋ฐฉํฅ์ ๊ณ ๋ คํ๋ฉด์ ์ต์๊ฐ์ ๊ฐฑ์ ํด ๋๊ฐ์ผ ํ๋ฏ๋ก 3์ฐจ์ DP๋ก ํด๊ฒฐํ ์ ์๋ค.
int[][][] dp = new int[n][m][3]; // d ๋ฐฉํฅ์ผ๋ก ์จ (i, j) ์์น
1๏ธโฃ ์ฒซ ๋ฒ์งธ ์ด (j == 0)
(i, 0) ์ขํ์ ๋๋ฌํ๋ ๊ฒฝ์ฐ
- 0๋ฒ ๋ฐฉํฅ(โ)์ผ๋ก ๋์ฐฉํ ๊ฒฝ์ฐ: ์ง์ ์ 1๋ฒ(↓) ๋๋ 2๋ฒ(โ)๋ง ๊ฐ๋ฅ
- 1๋ฒ ๋ฐฉํฅ(↓)์ผ๋ก ๋์ฐฉํ ๊ฒฝ์ฐ: ์ง์ ์ 0๋ฒ(โ)๋ง ๊ฐ๋ฅ
์ด ๋ฌธ์ ๋ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋ ๋ฒ ์ฐ์ ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฅํ ์ด์ ๋ฐฉํฅ์ ๊ณ ๋ คํด DP๋ฅผ ๊ฐฑ์ ํด์ผ ํ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
๐ ์ฝ๋ ์์
if (j == 0) {
// (i, j)๊ฐ 0๋ฒ ๋ฐฉํฅ์ผ๋ก ์๋ค๋ฉด: ์ด์ ์์น๋ (i-1, j+1)์์ 1 or 2 ๋ฐฉํฅ์ผ๋ก ์์ด์ผ ํจ
dp[i][j][0] = Math.min(dp[i-1][j+1][1], dp[i-1][j+1][2]) + map[i][j];
// (i, j)๊ฐ 1๋ฒ ๋ฐฉํฅ์ผ๋ก ์๋ค๋ฉด: ์ด์ ์์น๋ (i-1, j)์์ 0๋ฒ ๋ฐฉํฅ๋ง ๊ฐ๋ฅ
dp[i][j][1] = dp[i-1][j][0] + map[i][j];
}
2๏ธโฃ ๋ง์ง๋ง ์ด (j == m-1)
(i, m-1) ์ขํ์ ๋๋ฌํ๋ ๊ฒฝ์ฐ
- 1๋ฒ ๋ฐฉํฅ(↓)์ผ๋ก ๋์ฐฉํ ๊ฒฝ์ฐ: ์ง์ ์ 2๋ฒ ๋ฐฉํฅ(โ)๋ง ๊ฐ๋ฅ
- 2๋ฒ ๋ฐฉํฅ(โ)์ผ๋ก ๋์ฐฉํ ๊ฒฝ์ฐ: ์ง์ ์ 0๋ฒ(โ) ๋๋ 1๋ฒ(↓) ๋ฐฉํฅ๋ง ๊ฐ๋ฅ
์ค๋ฅธ์ชฝ ๋ ์ด์์๋ 0๋ฒ ๋ฐฉํฅ(โ)์ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฅํ ์ด์ ๋ฐฉํฅ์ ๊ณ ๋ คํด DP๋ฅผ ๊ฐฑ์ ํด์ผ ํ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
๐ ์ฝ๋ ์์
if (j == m - 1) {
// (i, j)๊ฐ 1๋ฒ ๋ฐฉํฅ(↓)์ผ๋ก ์๋ค๋ฉด: ์ด์ ์์น๋ (i-1, j)์์ 2๋ฒ ๋ฐฉํฅ๋ง ๊ฐ๋ฅ
dp[i][j][1] = dp[i - 1][j][2] + map[i][j];
// (i, j)๊ฐ 2๋ฒ ๋ฐฉํฅ(โ)์ผ๋ก ์๋ค๋ฉด: ์ด์ ์์น๋ (i-1, j-1)์์ 0๋ฒ ๋๋ 1๋ฒ ๋ฐฉํฅ ๊ฐ๋ฅ
dp[i][j][2] = Math.min(dp[i - 1][j - 1][0], dp[i - 1][j - 1][1]) + map[i][j];
}
3๏ธโฃ ์ค๊ฐ ์ด (1 ≤ j ≤ m - 2)
(i, j) ์ขํ์ ๋๋ฌํ๋ ๊ฒฝ์ฐ, ์ธ ๊ฐ์ง ๋ฐฉํฅ ๋ชจ๋์์ ์ด๋์ด ๊ฐ๋ฅํ๋ค.
๋ค๋ง, ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋ ๋ฒ ์ฐ์ ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ฐ ๋ฐฉํฅ์ ๋ํด ์ง์ ๋ฐฉํฅ์ ์ ์ธํ ๋๋จธ์ง ๋ฐฉํฅ๋ค ์ค์์ ์ต์๊ฐ์ ์ ํํด DP๋ฅผ ๊ฐฑ์ ํ๋ค.
๐ก ์์ ์ค๋ช
์๋ฅผ ๋ค์ด ํ์ฌ ์์น๊ฐ (i, j)๋ผ๊ณ ํ๋ฉด:
- 0๋ฒ ๋ฐฉํฅ(โ)์ผ๋ก ์จ ๊ฒฝ์ฐ: ์ง์ ์๋ 1๋ฒ(↓) ๋๋ 2๋ฒ(โ)๋ง ๊ฐ๋ฅ
- 1๋ฒ ๋ฐฉํฅ(↓)์ผ๋ก ์จ ๊ฒฝ์ฐ: ์ง์ ์๋ 0๋ฒ(โ) ๋๋ 2๋ฒ(โ)๋ง ๊ฐ๋ฅ
- 2๋ฒ ๋ฐฉํฅ(โ)์ผ๋ก ์จ ๊ฒฝ์ฐ: ์ง์ ์๋ 0๋ฒ(โ) ๋๋ 1๋ฒ(↓)๋ง ๊ฐ๋ฅ
๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
๐ ์ฝ๋ ์์
if (j > 0 && j < m - 1) {
// (i, j)๊ฐ 0๋ฒ ๋ฐฉํฅ(โ)์ผ๋ก ์๋ค๋ฉด: ์ด์ ์์น๋ (i-1, j+1)์์ 1๋ฒ ๋๋ 2๋ฒ ๋ฐฉํฅ ๊ฐ๋ฅ
dp[i][j][0] = Math.min(dp[i - 1][j + 1][1], dp[i - 1][j + 1][2]) + map[i][j];
// (i, j)๊ฐ 1๋ฒ ๋ฐฉํฅ(↓)์ผ๋ก ์๋ค๋ฉด: ์ด์ ์์น๋ (i-1, j)์์ 0๋ฒ ๋๋ 2๋ฒ ๋ฐฉํฅ ๊ฐ๋ฅ
dp[i][j][1] = Math.min(dp[i - 1][j][0], dp[i - 1][j][2]) + map[i][j];
// (i, j)๊ฐ 2๋ฒ ๋ฐฉํฅ(โ)์ผ๋ก ์๋ค๋ฉด: ์ด์ ์์น๋ (i-1, j-1)์์ 0๋ฒ ๋๋ 1๋ฒ ๋ฐฉํฅ ๊ฐ๋ฅ
dp[i][j][2] = Math.min(dp[i - 1][j - 1][0], dp[i - 1][j - 1][1]) + map[i][j];
}
๋ง์ง๋ง ํ์ ๋ชจ๋ ์ด์์, ์ธ ๋ฐฉํฅ์ ๋ํ ์ต์๊ฐ์ ์ฐพ์ผ๋ฉด ๋ฌ ์ฌํ์ ํ์ํ ์ต์ ์ฐ๋ฃ์ ๊ฐ์ ๊ตฌํ ์ ์๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 114760KB
์๊ฐ : 512ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static final int INF = 987654321;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] map = new int[n][m];
int[][][] dp = new int[n][m][3]; // d ๋ฐฉํฅ์ผ๋ก ์จ (i, j) ์์น
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
Arrays.fill(dp[i][j], INF);
}
}
// ์ด๊ธฐ ์ค์
for (int j = 0; j < m; j++) {
dp[0][j][0] = map[0][j];
dp[0][j][1] = map[0][j];
dp[0][j][2] = map[0][j];
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < m; j++) {
if (j == 0) {
dp[i][j][0] = Math.min(dp[i-1][j+1][1], dp[i-1][j+1][2]) + map[i][j];
dp[i][j][1] = dp[i-1][j][0] + map[i][j];
} else if (j == m-1) {
dp[i][j][2] = Math.min(dp[i-1][j-1][1], dp[i-1][j-1][0]) + map[i][j];
dp[i][j][1] = dp[i-1][j][2] + map[i][j];
} else {
dp[i][j][2] = Math.min(dp[i-1][j-1][0], dp[i-1][j-1][1]) + map[i][j];
dp[i][j][1] = Math.min(dp[i-1][j][2], dp[i-1][j][0]) + map[i][j];
dp[i][j][0] = Math.min(dp[i-1][j+1][1], dp[i-1][j+1][2]) + map[i][j];
}
}
}
int min = INF;
for (int j = 0; j < m; j++) {
for (int i = 0; i < 3; i++) {
min = Math.min(min, dp[n-1][j][i]);
}
}
System.out.println(min);
br.close();
}
}
dp๋ฅผ ๋์ฐ์ด๋ ์ซ์ดํ๋ ๋๋ฐ.. ์์ฆ์ ํฅ๋ฏธ๊ฐ ์๊ฒจ ์ด์ง ์ฌ๋ฐ๊ฒ ๋๊ปด์ง๋ค!
๋ฌผ๋ก ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ์ฐธ๊ณ ํด์ ํด๊ฒฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง ์ด์ฌํ ํ๋ค ๋ณด๋ฉด ํผ์ ํด๊ฒฐํ๋ ๋ ๋ ๋์ด๋๊ฒ ์ง...! ๐
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1263] ์๊ฐ ๊ด๋ฆฌ (0) | 2025.05.11 |
---|---|
[Boj_15980] ๋ช ์ ๋ฐฉํด๊พผ (0) | 2025.04.16 |
[Boj_7579] ์ฑ (0) | 2025.03.25 |
[Boj_1577] ๋๋ก์ ๊ฐ์ (0) | 2025.03.19 |
[Boj_19542] ์ ๋จ์ง ๋๋ฆฌ๊ธฐ (0) | 2025.03.17 |