Skip to content

Commit

Permalink
Add Post: [프로그래머스] 등굣길(Java)
Browse files Browse the repository at this point in the history
  • Loading branch information
Chaerim1001 committed Apr 9, 2024
1 parent 074ab2c commit 59cdd68
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
76 changes: 76 additions & 0 deletions _posts/2024-04-09-[프로그래머스] 등굣길(Java).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
title: "[프로그래머스] 등굣길(Java)"
date: 2024-04-09
categories: [Algorithm, 문제풀이]

tags: [Algorithm, CodingTest]
math: true
---

### 문제 풀이
프로그래머스 등굣길 문제입니다.
[문제 출처](https://school.programmers.co.kr/learn/courses/30/lessons/42898)

### (1) 문제 파악

![1](/assets/img/posts/2024-04-09/q.png){: width="700"}

최단 경로의 개수를 구하는 문제입니다.

### (2) 문제 풀이 방법 생각하기
최단 경로 문제이며, 이동은 오른쪽 혹은 아래쪽으로 가능하니 DP를 활용해서 풀 수 있을 것 같은데요!
점화식은

$$ dp[i][j] = dp[i-1][j] + dp[i][j-1] $$

로 세웠습니다.

여기서 주의할 점은 물 웅덩이의 좌표가 **(m, n)으로 주어진다는 것**입니다! (평소처럼 n,m 순서라고 생각했다가 10분동안 멍했네요..ㅎㅎ)

기본적으로 최단 경로의 개수를 구할 때에는 1열과 1행을 모두 1로 만들어놓고 점화식을 수행하는데요.
여기서는 물 웅덩이가 중간에 있을 수 있기 때문에 dp를 수행하기 전에 물 웅덩이 확인을 먼저 해줬습니다.

### (4) 구현

```java
class Solution {

public int solution(int m, int n, int[][] puddles) {
int[][] dp = new int[n+1][m+1];
final int MOD = 1_000_000_007;

for(int i=1; i<=m; i++) {
dp[1][i] = 1;
}

for(int i=1; i<=n; i++) {
dp[i][1] = 1;
}

for(int[] p:puddles) {
if(p[0] == 1) {
for(int i=p[1]; i<=n; i++) {
dp[i][1] = 0;
}
} else if(p[1] == 1) {
for(int i=p[0]; i<=m; i++) {
dp[1][i] = 0;
}
} else {
dp[p[1]][p[0]] = -1;
}
}

for(int i=2;i<=n;i++) {
for(int j=2; j<=m; j++) {
if(dp[i][j] == -1) {
dp[i][j] = 0;
continue;
}
dp[i][j] = (dp[i-1][j] + dp[i][j-1])%MOD;
}
}
return dp[n][m]%MOD;
}
}
```
Binary file added assets/img/posts/2024-04-09/q.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 59cdd68

Please sign in to comment.