티스토리 뷰
프로그래머스 42898번 - 등굣길
요구사항
1. 물에 잠기지 않은 지역을 통해 학교로 가려고 합니다. 단, 오른쪽과 아래쪽으로만 움직일 수 있습니다.
2. 집에서 학교까지 갈 수 있는 최단경로의 개수를 1, 000, 000, 007로 나눈 나머지를 반환하라.
요구사항 분석 및 풀이과정
1. 오른쪽과 아래쪽으로만 움직일 수 있다는 뜻은 특정 지역을 기준으로 해당 지역으로 들어오는 방향이 왼쪽과 위쪽밖에 없다는 것을 의미합니다.
2. 따라서 집에서 각 지역까지 갈 수 있는 최단경로의 개수를 dp[지역]이라고 하면 다음과 같습니다.
dp[지역] = dp[왼쪽 지역] + dp[위쪽 지역]
3. dp[지역]을 코드로 옮기기 위하여 지역을 좌표 정보로 표현하여 점화식을 정리하면 다음과 같습니다. 단, 집의 위치는 (0, 0)라고 하겠습니다.
집의 위치 = (0, 0)
학교의 위치 (n-1, m-1)
지역 = (x, y)
왼쪽 지역 = (x-1, y)
위쪽 지역 = (x, y-1)
dp[0][0] = 1
dp[우물] = -1 (도달할 수 없음)
dp[y][x] = (dp[y-1][x] + dp[y][x-1]) % 1, 000, 000, 007
4. dp[0][0] = 1이라는 점에서 의문을 가질 수 있습니다. 원래 0인 게 맞지만, 차후 점화식 계산에 편의를 위하여 1로 지정하였습니다.
왜냐하면 dp[0][1] 과 dp[1][0] 은 집에서 출발하여 바로 도착하는 최단경로만 존재하며, 값은 1이지만 dp[0][0] = 0이라면 예외가 발생하기 때문입니다.
점화식의 정의를 완벽하게 지키려면 dp[0][0] = 0으로 지정하되, 0행과 1열에 해당하는 지역을 따로 처리해주면 됩니다.
소스코드 작성
class Solution {
private static final int MOD = 1_000_000_007;
private static int mod(int a, int b, int mod) {
return (a % mod + b % mod) % mod;
}
public int solution(int m, int n, int[][] puddles) {
int [][] dp = new int[n][m];
dp[0][0] = 1;
for(int[] puddle : puddles) {
int x = puddle[0] - 1;
int y = puddle[1] - 1;
dp[y][x] = -1;
}
for(int y = 0; y < n; y++) {
for(int x = 0; x < m; x++) {
if ((x == 0 && y == 0) || dp[y][x] == -1) {
continue;
}
if (y-1 >= 0 && dp[y-1][x] != -1) {
dp[y][x] = mod(dp[y][x], dp[y-1][x], MOD);
}
if (x-1 >= 0 && dp[y][x-1] != -1) {
dp[y][x] = mod(dp[y][x], dp[y][x-1], MOD);
}
}
}
return dp[n-1][m-1] % MOD;
}
}
결과
소스코드 깃허브 주소
'코딩테스트 > 알고리즘' 카테고리의 다른 글
[알고리즘]프로그래머스 1844번 - 게임 맵 최단거리 (0) | 2022.01.18 |
---|---|
[알고리즘]프로그래머스 43105번 - 정수 삼각형 (0) | 2022.01.17 |
[알고리즘]프로그래머스 42861번 - 섬 연결하기 (0) | 2022.01.17 |
[알고리즘]프로그래머스 42577번 - 전화번호 목록 (0) | 2022.01.16 |
[알고리즘]프로그래머스 49189번 - 가장 먼 노드 (0) | 2022.01.16 |
- Total
- Today
- Yesterday
- 스트림
- 문자열
- dsu
- kotlin
- TDD
- 카카오
- set
- 해쉬
- 비트연산
- k8s
- 스택
- sql
- 탐욕법
- 쓰레드
- JPA
- Uber
- 구현
- 코딩인터뷰
- 우선순위큐
- 프로그래머스
- 알고리즘
- dfs
- 회고
- 정렬
- 오늘의집
- dp
- 연결리스트
- Java
- BFS
- 코드 스니펫
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |