계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다.
아래 그림은 m = 4, n = 3 인 경우입니다.
가장 왼쪽 위, 즉 집이 있는 곳의 좌표는 (1, 1)로 나타내고 가장 오른쪽 아래, 즉 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다.
격자의 크기 m, n과 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles이 매개변수로 주어집니다. 오른쪽과 아래쪽으로만 움직여 집에서 학교까지 갈 수 있는 최단경로의 개수를 1,000,000,007로 나눈 나머지를 return 하도록 solution 함수를 작성해주세요.
정말 기본적인 dp문제인데 자꾸 시간초과가 아닌 런타임에러가 나는것이다.
진짜 뭐지 싶어서 질문하기에 바로 달려갔다.
그래서 문제에서 주어지는 웅덩이인 puddles이 행과 열이 반대로 뒤바뀌어 주어진다는 것을 알았다...
문제 출제자가 더 원망스러웠던건 그렇게 행과 열을 바꿀거면 왜 테스트케이스엔 (2,2)의 경우를 줬냐는 것이다.
뭐 근데 그렇게 많은 시간을 낭비하진 않았으니 그냥 넘어간다!
아 그리고 이 문제에서 나머지 연산 (A + B) % mod = (A % mod + B % mod) % mod 법칙을 알고가자!
코오롱 인성검사 및 코딩테스트 합격메일이 날아왔고 2/8일날 면접이 잡혔다. 면접이 오랜만이라서 좀 긴장되긴하지만 그래도 합격하자!
class Solution { static int[][] map; public int solution(int m, int n, int[][] puddles) { int answer = 0; map = new int[n + 1][m + 1]; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) map[i][j] = 1; for(int[] puddle : puddles) { if(puddle[0] == 1) for(int i = puddle[1]; i <= n; map[i++][1] = 0); else if(puddle[1] == 1) for(int i = puddle[0]; i <= m; map[1][i++] = 0); else map[puddle[1]][puddle[0]] = 0; } for(int i = 2; i <= n; i++){ for(int j = 2; j <= m; j++) { if(map[i][j] == 0) continue; map[i][j] = (map[i - 1][j]%1000000007 + map[i][j - 1]%1000000007) %1000000007; } } return map[n][m]; } }