Lewis's Tech Keep
[프로그래머스] 보행자 천국 본문
- 참고 : programmers.co.kr/learn/courses/30/lessons/1832?language=java
- dp 문제
- bfs로 풀려고 했으나 m과 n이 500 이므로 n(500!)의 경우 시간 초과
- dp로 접근하는 것이 현명한 선택이었다.
- 1-indexed 로 접근하는 것이 for구문이 한방에 풀리기 때문에 더 현명한 선택이었다.
(0-indexed 의 경우 첫 행, 첫 열을 따로 초기화 해주어야 함)
- 0일 경우
- dp[i][j][0] += dp[i][j-1][0] + dp[i-1][j][1];
- dp[i][j][1] += dp[i][j-1][0] + dp[i-1][j][1];
< i, j 번째는 0일 경우 : i-1, j (위쪽에서 온 경우의 수) + i, j-1 (왼쪽에서 온 경우의 수)>
- 1일 경우
- dp[i][j][0] = 0
- dp[i][j][1] = 0
- 2일 경우
- dp[i][j][0] = dp[i][j-1][0];
< i, j 번째는 2일 경우 : i-1, j (위쪽에서 온 경우의 수) 를 그대로 진행>
- dp[i][j][1] = dp[i-1][j][1];
< i, j 번째는 2일 경우 : i, j-1 (왼쪽에서 온 경우의 수) 를 그대로 진행>
더보기
class Solution {
int MOD = 20170805;
public int solution(int m, int n, int[][] cityMap) {
int[][][] dp = new int[m+1][n+1][2];
dp[1][1][0] = 1; // 왼쪽에서 온 것
dp[1][1][1] = 1; // 위에서 온 것
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
if(cityMap[i-1][j-1] == 0) {
dp[i][j][0] += (dp[i-1][j][1] + dp[i][j-1][0]) % MOD;
dp[i][j][1] += (dp[i-1][j][1] + dp[i][j-1][0]) % MOD;
}
if(cityMap[i-1][j-1] == 1) {
dp[i][j][0] = 0;
dp[i][j][1] = 0;
}
if(cityMap[i-1][j-1] == 2) {
dp[i][j][0] = dp[i][j-1][0];
dp[i][j][1] = dp[i-1][j][1];
}
}
}
return dp[m][n][0];
}
}
'Java > 알고리즘' 카테고리의 다른 글
[프로그래머스] 리틀 프렌즈 사천성 - 실패 코드 (0) | 2021.05.26 |
---|---|
[프로그래머스] 가장 먼 노드 (0) | 2021.05.01 |
[프로그래머스] 보행자 천국 - 실패 (0) | 2021.04.27 |
[프로그래머스] 자물쇠와 열쇠 (0) | 2021.04.16 |
[프로그래머스] 브라이언의 고민 (0) | 2021.04.15 |
Comments