알고리즘/Programmers

[프로그래머스] 등굣길

벨에삐 2023. 3. 8. 11:38

https://school.programmers.co.kr/learn/courses/30/lessons/42898

 

프로그래머스

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

programmers.co.kr

 

프로그래머스 코딩 테스트 고득점 Kit에 포함된 Level 3 DP 문제입니다.

 

#include <string>
#include <vector>

using namespace std;

const int MOD = 1000000007;
int x, y, dp[101][101];
bool flag[101][101];

void init(vector<vector<int>>& puddles){
    for(vector<int> puddle : puddles){
        x = puddle[0];
        y = puddle[1];
        flag[y][x] = 1;
    }    
}

int solution(int m, int n, vector<vector<int>> puddles) {
    int answer = 0;
    init(puddles);
    
    dp[1][1] = 1;
    
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            if(i == 1 && j == 1) continue;
            if(flag[i][j]) continue;
            dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % MOD;
        }
    }
    
    answer = dp[n][m];
    return answer;
}

 

DP 문제이므로 항상 그랬던 것처럼 다음의 3단계로 풀이합니다.

 

1) table 정의

dp[i][j] : i행 j열까지 갈 수 있는 최단경로의 개수

 

2) 점화식 찾기

if(flag[i][j]) continue; // 물에 잠겼을 경우 그곳까지 갈 수 있는 최단경로의 수는 0이므로 continue;

dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % MOD;

 

3) 초기값 설정

dp[1][1] = 1;

 

물에 잠긴 곳을 flag 배열을 통해 체크해 주면 그 이후에는 쉬운 문제입니다. 지금까지 풀어온 BOJ 골드, 플래티넘 문제에 비하면 프로그래머스 Level 3까지는 체감상 난이도가 어렵지 않은 듯합니다. 

'알고리즘 > Programmers' 카테고리의 다른 글

[프로그래머스] 정수 삼각형  (0) 2023.03.08
[프로그래머스] 순위  (0) 2023.03.07
[프로그래머스] 가장 먼 노드  (0) 2023.03.07