로직 (DP)
기본적인 로직은 다음과 같다.
1. 위와 왼쪽 블록을 값을 확인해 조건에 맞게 더해준다.
2. 위 또는 왼쪽 블록이 막혀있다면 0을 더해준다. 만약 회전 불가 칸이라면 위쪽을 조사하고 있다면 그 바로 위의 값을 다시 확인, 왼쪽도 마찬가지로 그 왼쪽 칸을 다시 확인한다.
3. 결과 도출
오류가 발생했었다.
기존의 코드 -> 주어진 Map의 1과 2를 -1과 -2로 바꾸고 주어진 해당 Map에 DP 적용
변경 코드 -> 새로운 Map을 생성해 동일 로직 처리
오류가 발생한 원인은 찾지 못했다. 일단은 앞으로 새로운 맵을 만들어서 사용하는 것이 맞을 것 같다.
코드
- 틀린 코드
class Solution {
public static int MOD = 20170805;
public int solution(int m, int n, int[][] cityMap) {
for(int x=0; x<m; x++){
for(int y=0; y<n; y++){
if(cityMap[x][y] == 1){
cityMap[x][y] = -1;
}
if(cityMap[x][y] == 2){
cityMap[x][y] = -2;
}
}
}
for(int x=0; x<m; x++){
for(int y=0; y<n; y++){
if(x == 0 && y == 0){
cityMap[0][0] = 1;
continue;
}
if(cityMap[x][y] == 0){
cityMap[x][y]=(Up(x,y,cityMap)+Left(x,y,cityMap))%MOD;
}
}
}
return cityMap[m-1][n-1];
}
public static int Up(int x, int y, int[][] cityMap){
if(x-1 < 0){
return 0;
}
if(cityMap[x-1][y] == -1){
return 0;
}
if(cityMap[x-1][y] == -2){
return Up(x-1, y, cityMap);
}
return cityMap[x-1][y];
}
public static int Left(int x, int y, int[][] cityMap){
if(y-1 < 0){
return 0;
}
if(cityMap[x][y-1] == -1){
return 0;
}
if(cityMap[x][y-1] == -2){
return Left(x, y-1, cityMap);
}
return cityMap[x][y-1];
}
}
- 수정 코드
class Solution {
public static int MOD = 20170805;
public int solution(int m, int n, int[][] cityMap) {
int[][] map = new int[m][n];
for(int x=0; x<m; x++){
for(int y=0; y<n; y++){
if(x == 0 && y == 0){
map[0][0] = 1;
continue;
}
if(cityMap[x][y] == 0){
map[x][y]=(Up(x,y,cityMap,map)+Left(x,y,cityMap,map))%MOD;
}
}
}
return map[m-1][n-1];
}
public static int Up(int x, int y, int[][] cityMap, int[][] map){
if(x-1 < 0){
return 0;
}
if(cityMap[x-1][y] == 1){
return 0;
}
if(cityMap[x-1][y] == 2){
return Up(x-1, y, cityMap, map);
}
return map[x-1][y];
}
public static int Left(int x, int y, int[][] cityMap, int[][] map){
if(y-1 < 0){
return 0;
}
if(cityMap[x][y-1] == 1){
return 0;
}
if(cityMap[x][y-1] == 2){
return Left(x, y-1, cityMap, map);
}
return map[x][y-1];
}
}
'Algorithm > Practice' 카테고리의 다른 글
Programmers - 외벽점검 with JAVA (V) (0) | 2023.07.25 |
---|---|
Programmers - 교점에 별 만들기 with JAVA (0) | 2023.07.24 |
Programmers - 광고 삽입 with JAVA (0) | 2023.07.22 |
Programmers - 인사고과 with JAVA (0) | 2023.07.21 |
Programmers - 숫자블록 with JAVA (0) | 2023.07.21 |