728x90
https://programmers.co.kr/learn/courses/30/lessons/42898
코딩테스트 연습 - 등굣길
계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m =
programmers.co.kr
- 문제

문제 
제한 사항 - 효율성 체크가 있는 문제이다( BFS 하기에는 시간 초과)
풀이
- N * M 크기의 MAP을 선언하여 웅덩이를 -1로 세팅한다( 나머지는 0) --- > 초기
- 이중 FOR문을 돈다
- 경우 1 : 물 웅덩이일 경우 -> map[i][j]map [i][j] == -1 일 경우 map [i][j]를 0으로 세팅해 준다(물 웅덩이를 지난 경우의 수가 있을 수 없기 때문에 0개의 경우의 수다)
- 경우 2 : 물 웅덩이가 아닐경우 -> map [i][j]가 지날 갈 수 있는 경우
- map [i][j]를 오기 위해서는 i!= 0 , j!= 0 일 경우에는 map [i-1][j]을 경로를 거치거나, map [i][j-1] 경로를 거쳐야 된다.
- 경우 2-1 : i != 0 이 아닐 때, map [i-1][j] 값을 map [i][j]에 더해준다.
- 경우 2-2 : j != 0 이 아닐 때, map [i][j-1] 값을 map [i][j]에 더해준다.
- map [n-1][m-1]를 1000000007로 나눈 나머지를 리턴한다.
-
public static int solution(int m, int n, int[][] puddles) { int[][] map = new int[n][m]; for(int[] xy: puddles) { int x = xy[0] - 1; int y = xy[1] - 1; map[y][x] = -1;//물 웅덩이 -1값으로 초기화 } map[0][0] = 1;// 시작 경우의 수 1 for(int i=0;i<n;++i) { for(int j=0;j<m;++j) { if(map[i][j] == -1) {//만약 물 웅덩이일 경우 map[i][j] = 0;// 물웅덩이가 map[i-1][j],map[i][j-1]일 경우 물웅덩이는 경우의 수에 포함되면 안되니까 0으로 세팅 continue; } if(i != 0 ) { // i가 0이 아닐때 map[i][j] += map[i - 1][j] % 1000000007; // 현재 위치에 map[i-1][j] 를 더한다 } if(j != 0) { map[i][j] += map[i][j-1] % 1000000007; // 현재 위치에 map[i][j-1] 를 더한다 } } } return map[n-1][m-1] % 1000000007;//최종까지 갔을때의 경우의 수를 리턴 }
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| LEVEL 3 : 디스크컨트롤러 (0) | 2021.11.25 |
|---|---|
| LEVEL 3 : [1차] 추석 트래픽 (0) | 2021.11.24 |
| LEVEL 3 : N으로 표현 (0) | 2021.11.23 |
| LEVEL 3 : 가장 먼 노드 (0) | 2021.11.22 |
| LEVEL 3 : 입국심사 (0) | 2021.11.22 |