코테/프로그래머스

[프로그래머스/Lv. 3] 등굣길 (JAVA)

imname1am 2023. 10. 1. 22:29
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🔺 코드

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
import java.util.*;
 
class Solution {
    static final int mod = 1_000_000_007;
    
    public int solution(int m, int n, int[][] puddles) {
        
        int[][] dp = new int[n + 1][m + 1];
        
        // dp 배열 초기화
        dp[1][1= 1;
        for(int[] puddle : puddles) dp[puddle[1]][puddle[0]] = -1;
        
        for(int i = 1 ; i <= n ; i++) {
            for(int j = 1 ; j <= m ; j++) {
                if(dp[i][j] == -1)   continue;   // 웅덩이라면 패스
                
                if(dp[i - 1][j] > 0)  dp[i][j] += dp[i - 1][j] % mod;    // 위쪽 값
                if(dp[i][j - 1> 0)  dp[i][j] += dp[i][j - 1] % mod;    // 왼쪽 값
            }
        }
        
        return dp[n][m] % mod;
    }
}
 
cs

 

 

🧩 해결 아이디어

• DP

- dp 배열 초기화 값 : 출발 지점은 1, 장애물은 -1로 설정

 

- dp 배열 완전탐색하면서 해당 칸 값이 -1이라면 웅더이이므로 패스

- 위쪽 값이 0보다 크다면, 현재 값에 위쪽 값을 더함

- 왼쪽 값이 0보다 크다면, 현재 값에 왼쪽 값을 더함

 

 

💥 유의사항

- else if로 하면 왼쪽과 위쪽값을 모두 포함시킬 수 없으므로 두 경우를 모두 처리하도록 if문 사용

- 12번째 줄에서dp[ puddle[1] ][ puddle[0] ] = -1;이 아닌 dp[ puddle[1] ][ puddle[0] ] = -1;이어야 함

 

 

 


💬 느낀 점

최단 경로래서 BFS로 풀 수는 있는데 효율성에서 통과가 안 된당

 

효율성 해결 방법 중에는 이런 것도 있었다.

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[프로그래머스] 등굣길 JAVA

전형적인 DP 문제입니다. 어렵진 않은데 DP말고 다른 방식으로 풀면 효율성 테스트에서 시간초과가 나와 level 3 에 선정된것같습니다.집에서 오른쪽 아래로만 움직여 학교까지 가는 최단 거리를

velog.io

 

반응형