[프로그래머스/Lv3] 등굣길_C++

1 분 소요

[프로그래머스/Lv3] 등굣길_C++


문제 내용

  • 초등학교 때 배운 최단경로 문제와 동일하다.
  • 출발지점 부터 도착지점까지 웅덩이를 피해 가는 최단경로를 구하는 문제이다.


입출력 예

Row Col 웅덩이 return
4 3 [[2,2]] 4



문제 풀이

  • 가독성을 위해 주석으로도 설명하겠다.
  • 최대 크기의 배열을 설정한 뒤, 각 요소에 그 지점 까지 오는데 얻을 수 있는 경우의 수를 저장한다.
  • 오른쪽 or 하단 으로만 이동하므로 왼쪽 과 상단을 경우의 수를 1로 지정하여 배열을 초기화 한다.
    • 0 1 0 0 0
    • 0 1 1 1 1
    • 0 1 0 0 0
    • 0 1 0 0 0
    • 0 1 0 0 0
      맨위 행에 1이 있는 이유는 자신의 value를 왼쪽,위 의 합의 값으로 정하기 때문에 처음에 초기화 할 때 사용하기 위함이다.
  • 물 웅덩이가 있는 부분은 -1로 초기화 해주고, 웅덩이 부분은 경우의수로 판단하지 않게 하기 위해서 value를 넣을 때에는 0으로 다시 정의해 주었다.



풀이 CODE

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int root[101][101] ={0};


int solution(int m, int n, vector<vector<int>> puddles) {
                                                        //    0  1  0  0  0      -> 1이 필요.
    for(int y=0; y<=m;y++){ root[y][1] =1; }            //    0  1  1  1  1      처음에 갈 수 있는 갯수로 초기화
    for(int x=1; x<=n;x++){ root[1][x] =1; }            //    0  1  -1 0  0
    for(int i=0; i<puddles.size();i++){                 //    0  1  0  -1 0
        int dump_y =puddles[i][0];                      //    0  1  0  0  0
        int dump_x =puddles[i][1];
        root[dump_y][dump_x] = -1;
    }
    

    for(int y=1; y<=m; y++){          
        for(int x=1; x<=n; x++){               
            int temp = root[y][x];           // 웅덩이라면 0으로 그렇지 않다면 왼쪽,위쪽의 합으로
            root[y][x] = temp == -1 ? 0 : (root[y-1][x] + root[y][x-1]) % 1000000007 ;     
        }
    }
    
   
    return root[m][n];

}

댓글남기기