문제풀이/프로그래머스

[프로그래머스] 등굣길

Hyeon-Uk 2021. 3. 6. 22:34
반응형

programmers.co.kr/learn/courses/30/lessons/42898

 

코딩테스트 연습 - 등굣길

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m =

programmers.co.kr


풀이)

dp문제이다.

1.puddle에 있는 위치좌표들을 maze배열에 체크를 해둔다.( 주의해야 할 점은 puddles도 m,n순서이므로 신경써주자)

2.dp배열을 max+1만큼 할당을 해준다.

3.dp[1][1](시작점)은 1로 해둔다. 왜냐하면 초반 초기화를 하지 않기위해서이다.

4.물웅덩이가 있는 좌표라면, 해당 좌표까지 가는 최단경로는 없으므로, 해당dp[i][j]=0이 된다.

5.dp[i][j]는, i,j좌표까지 올 수 있는 최단 경로의 수 이므로 dp[i][j-1]에서 내려오는 경우의수+dp[i-1][j]에서 오른쪽으로 이동하는 경우의 수가 된다.

 

수행시간)

모든 좌표를 탐색하므로 O(M*N)이 된다.

 

코드)

#include <string>
#include <vector>

using namespace std;

bool maze[101][101]={0};
int dp[101][101]={0};

int solution(int m, int n, vector<vector<int>> puddles) {
    int answer = 0;
    for(int i=0;i<puddles.size();i++){
        maze[puddles[i][1]][puddles[i][0]]=true;
    }
    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(!maze[i][j]){
                dp[i][j]=(dp[i-1][j]+dp[i][j-1])%1000000007;
            }
        }
    }
    answer=dp[n][m];
    
    return answer;
}

 

실행결과)

반응형