[프로그래머스] 보행자 천국
https://school.programmers.co.kr/learn/courses/30/lessons/1832
오른쪽
또는 아래
방향으로 한 칸씩 이동 가능하다.city_map[i][j]
에는 도로의 상황을 나타내는 값이 저장되어 있다.0
인 경우에는 자동차가 자유롭게 지나갈 수 있다.1
인 경우에는 자동차 통행이 금지되어 지나갈 수 없다.2
인 경우는 보행자 안전을 위해 좌회전이나 우회전이 금지된다. 출발점
의 좌표는 (0, 0), 도착점
의 좌표는 (m - 1, n - 1)이다.20170805
로 나눈 나머지 값을 출력한다.DP
를 3차원 배열
로 구현해서 해결합니다.위치의 상태(state)
에 따라 구분합니다.import java.util.*;
class Solution {
int MOD = 20170805;
public int solution(int m, int n, int[][] cityMap) {
int answer = 0;
// 가로로 가는 방향 : 1
// 세로로 가는 방향 : 2
int[][][] dp = new int[2][m + 1][n + 1];
dp[0][0][0] = 1; // 초기값
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++) {
int state = cityMap[i][j]; // 현재 위치의 상태
// 오른쪽, 아래 둘 다 갈 수 있음
if(state == 0) {
// 세로 -> 오른쪽, 아래 모두 이동 가능
dp[0][i + 1][j] += (dp[0][i + 1][j] + dp[0][i][j] + dp[1][i][j]) % MOD;
// 가로 -> 오른쪽, 아래 모두 이동 가능
dp[1][i][j + 1] += (dp[1][i][j + 1] + dp[1][i][j] + dp[0][i][j]) % MOD;
}
// 이전의 방향으로만 갈 수 있음
else if(state == 2) {
// 세로 -> 세로 방향으로만 이동 가능
dp[0][i + 1][j] = (dp[0][i + 1][j] + dp[0][i][j]) % MOD;
// 가로 -> 가로 방향으로만 이동 가능
dp[1][i][j + 1] = (dp[1][i][j + 1] + dp[1][i][j]) % MOD;
}
}
}
answer = (dp[0][m - 1][n - 1] + dp[1][m - 1][n - 1]) % MOD;
return answer;
}
}