๐๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/42898
โจํต์ฌ ๋ด์ฉ
"์ค๋ฅธ์ชฝ๊ณผ ์๋์ชฝ"์ผ๋ก๋ง ์์ง์ฌ
์ง์์ ํ๊ต๊น์ง ๊ฐ ์ ์๋ ์ต๋จ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ "1,000,000,007"๋ก ๋๋ ๋๋จธ์ง return
๐คํด๊ฒฐ ์์ด๋์ด
์ ํ: DP
ํ์ฌ ์์น(i, j)์์ ๊ฒฝ๋ก์ ๊ฐ์ด ์ต๋๊ฐ ๋๋ ค๋ฉด ์ผ์ชฝ(i, j-1) ํน์ ์(i-1, j)์์ ์์ผ ํ๋ค
๐กdp ๊ตฌ์กฐ
1. dp ์ ์
- (i, j) ์์น๊น์ง ์ฌ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก์ ๊ฐ์
2. dp ์ด๊ธฐํ
- ์ง์ ์์น: (0, 0)
- ์์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ ์์น (์ผ์ชฝ์์ ์ฌ ์ ์๋ ์์น): (i, 0)
- ์ผ์ชฝ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ ์์น (์์์ ์ฌ ์ ์๋ ์์น): (0, j)
3. ์ ํ์
if (์
๋ฉ์ด๊ฐ ์๋๋ฉด):
dp[i][j] = dp[i][j-1] + dp[i-1][j]
๐ก์ฃผ์ํ ๊ฒ
1. puddles์ ํ๊ณผ ์ด์ ์์น๊ฐ ๋ฐ๋์ด ์ ๋ฌ๋๋ค
2. % ์ฐ์ฐ์ ํด์ return ํด์ผ ํ๋ค (๋ฌธ์ ์กฐ๊ฑด ์ ์ฝ๊ธฐ)
- ์ฐ์ฐ ์ค๊ฐ์ % ์ฐ์ฐ์ ํด ์ฃผ์ด์ผ ์๊ฐ ์ด๊ณผ๊ฐ ๋์ง ์๋๋ค (๋ชจ๋๋ฌ ์ฐ์ฐ ๋ฒ์น ํ์ฉ)
+) ๋ชจ๋๋ฌ ์ฐ์ฐ ๋ฒ์น
(A + B) % p = ((A % p) + (B % p)) % p
(A * B) % p = ((A % p) * (B % p)) % p
(A - B) % p = ((A % p) - (B % p) + p) % p
โ ์ ๋ต ์ฝ๋ (Python)
def solution(m, n, puddles):
# 0. board ์ฑ์ฐ๊ธฐ (1: ์
๋ฉ์ด)
board = [[0 for _ in range(m)] for _ in range(n)]
for p in puddles:
if p != []:
board[p[1] - 1][p[0] - 1] = 1
# 1.dp ์ ์
dp = [[0 for _ in range(m)] for _ in range(n)]
# 2. ์ด๊ธฐํ
# 2-1. ์์ - ์ถ๋ฐ ์ง์ ์๋ ์
๋ฉ์ด๊ฐ ์์
dp[0][0] = 1
# 2-2. (i, 0) - ์์์๋ง ์ฌ ์ ์์
for i in range(n):
if board[i][0]:
break
dp[i][0] = 1
# 2-2. (0, j) - ์ผ์ชฝ์์๋ง ์ฌ ์ ์์
for j in range(m):
if board[0][j]:
break
dp[0][j] = 1
# 3. ์ ํ์
for i in range(1, n):
for j in range(1, m):
# ์ผ์ชฝ, ์์ชฝ์์ ์จ ๊ฐ ๋ํ๊ธฐ
if not board[i][j]: # ์
๋ฉ์ด๋ผ๋ฉด
dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 1000000007
// 4. output
return dp[n - 1][m - 1] % 1000000007
โ ์ ๋ต ์ฝ๋ (Java)
class Solution {
public int solution(int m, int n, int[][] puddles) {
// 0. board ์ฑ์ฐ๊ธฐ (1: ์
๋ฉ์ด)
int[][] board = new int[n][m];
if (puddles[0].length > 0){
for (int i = 0 ; i < puddles.length; i++) {
board[puddles[i][1] - 1][puddles[i][0] - 1] = 1;
}
}
// 1. dp ์ ์
int[][] dp = new int[n][m];
// 2. ์ด๊ธฐํ
// 2-1. ์์ - ์ถ๋ฐ ์ง์ ์๋ ์
๋ฉ์ด๊ฐ ์์
dp[0][0] = 1;
// 2-2. (i, 0) - ์์์๋ง ์ฌ ์ ์์
for (int i = 0 ; i < n; i++) {
if (board[i][0] == 1) {
break;
}
dp[i][0] = 1;
}
// 2-2. (0, j) - ์ผ์ชฝ์์๋ง ์ฌ ์ ์์
for (int j = 0 ; j < m; j++){
if(board[0][j] == 1) {
break;
}
dp[0][j] = 1;
}
// 3. ์ ํ์
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
// ์ผ์ชฝ, ์์ชฝ์์ ์จ ๊ฐ ๋ํ๊ธฐ
if (board[i][j] == 0) // ์
๋ฉ์ด๋ผ๋ฉด ๋น์๋๊ธฐ
dp[i][j] = (dp[i][j-1] + dp[i-1][j]) % 1000000007;
}
}
// debug - ๊ทธ๋๋ก ์ ์ถํ๋ฉด ์๊ฐ ์ด๊ณผ (์ฃผ์)
// for (int i = 0 ; i < n; i++) {
// for (int j = 0 ; j < m; j++) {
// System.out.printf("%d ", dp[i][j]);
// }
// System.out.println();
// }
// 4. output
return dp[n-1][m-1] % 1000000007;
}
}
'algorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] ๋ฆฌ์ฝ์ณ ๋ก๋ด (Python) (0) | 2024.07.11 |
---|---|
[Programmers] ๋ ์ ์ฌ์ด์ ์ ์ ์(Python, Java) (0) | 2024.07.04 |
[Programmers] ์๊ฒฉ ์์คํ (Python, Java) (0) | 2024.07.03 |
[programmers] ์ ์ ์ผ๊ฐํ - Python, Java (0) | 2024.07.01 |
[python]level1. ํคํจ๋ ๋๋ฅด๊ธฐ (0) | 2022.02.08 |