-
[프로그래머스] 동적계획법 - 등굣길알고리즘 공부/문제 풀이 2020. 8. 24. 13:35
풀이방법
1. 중학교 때인가 배웠던 것처럼 숫자를 합하는 방식으로 진행한다.
1 1 1 1 2 3 4 1 3 6 10 2. 갈 수 없는 곳은 -1, [m][0],[0][n] 에는 1로 초기화한다. (나머지는 자동 0 초기화)
1 1 1 1 -1 0 0 1 0 0 0 3. 만약 [m][0],[0][n]에서 -1값이 있다면 그 다음 칸들은 절대 갈 수 없다 ((0,2)가 -1인 경우 (0,3)도 -1이 될 수밖에 없음)
1 -1 -1 1 -1 0 0 1 0 0 0 4. 0인 칸들을 계산한다
map[i][j]=map[i-1][j]+map[i][j-1]
5. -1인 칸은 0으로 바꿔준뒤 다음 칸으로 넘어간다.
static int solution(int m, int n, int[][] puddles) { int[][] map=new int[m][n]; for(int i=1;i<m;i++) map[i][0]=1; for(int j=1;j<n;j++) map[0][j]=1; //물에 잠긴 곳은 -1 for(int k=0;k<puddles.length;k++) { int i=puddles[k][0]-1; int j=puddles[k][1]-1; map[i][j]=-1; if(i==0) { for(int x=j;x<n;x++) map[0][x]=0; } if(j==0) { for(int x=i;x<m;x++) map[x][0]=0; } } for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { if(map[i][j]==-1) { map[i][j]=0; continue; } map[i][j]=map([i-1][j]+map[i][j-1])%1000000007; } } return map[m-1][n-1]; }
정확도 문제는 모두 맞았지만 효율성 문제가 계속 오답이 나서
서칭해보니 계산 중간에 오버플로우가 난 것이 원인이라고 하여
map[i][j]=map[i-1][j]+map[i][j-1]%1000000007;
이렇게 수정해 주었더니 효율성 문제까지 모두 맞혔다
'알고리즘 공부 > 문제 풀이' 카테고리의 다른 글
[프로그래머스] DFS/BFS - 단어 변환 (1) 2020.08.25 [프로그래머스] 깊이 우선 탐색 - 타겟 넘버 (1) 2020.08.25 [프로그래머스] 동적 계획법 - 정수 삼각형 (1) 2020.08.23 [프로그래머스] 동적 계획법 - N으로 표현 (1) 2020.08.23 [프로그래머스] 탐욕 알고리즘 - 단속카메라 (1) 2020.08.18