본문 바로가기

프로그래머스/동적계획법

보행자 천국

728x90

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

 

코딩테스트 연습 - 보행자 천국

3 3 [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 6 3 6 [[0, 2, 0, 0, 0, 2], [0, 0, 2, 0, 1, 0], [1, 0, 0, 2, 2, 0]] 2

programmers.co.kr

처음에는 밑에와 같이 DFS로 풀었더니 시간초과가 났다 그때서야 이문제가 DFS로 푸는 문제가 아니라는 것을 알게 되었다

#include <vector>
#include <string>
#include <iostream>
using namespace std;

int MOD = 20170805;

int dx[] = {1,0}; //아래
int dy[] = {0,1}; //오른쪽

int count;

void dfs(vector<vector<int>>& city_map, int x, int y, int n, int m, string way){
    
   // cout<<"hi"<<endl;
    if((x==m-1) && (y ==n-1)){
        count++;
        count%MOD;
        return;
    }
    
    if(city_map[x][y]==1){
        return;
    }
 
    
    if(city_map[x][y]==2 && way!="s"){
       if(way == "lr"){
            int nx = x+dx[1];
            int ny = y+dy[1];
           if(nx>=0 && nx<m && ny>=0 && ny<n){
            dfs(city_map,nx,ny,n,m,"lr");
           }
       } 
        else{
            int nx = x+dx[0];
            int ny = y+dy[0];
           if(nx>=0 && nx<m && ny>=0 && ny<n){
            dfs(city_map,nx,ny,n,m,"ud");
           }
        }
    }
    else if(city_map[x][y]==0 || way=="s"){
        for(int i=0; i<2; i++){
        int nx = x+dx[i];
        int ny = y+dy[i];
        if(nx>=0 && nx<m && ny>=0 && ny<n){
            if(i==1){
                 dfs(city_map,nx,ny,n,m,"lr");
            }
            else{
                 dfs(city_map,nx,ny,n,m,"ud");
            }
        }
        }
    }
    
    return;
    
}

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int m, int n, vector<vector<int>> city_map) {
    int answer = 0;
    count =0;
    dfs(city_map,0,0,n,m,"s");
    answer = count;
    return answer;
}

생각해보니 이문제가 저번에 풀었던 등굣길 문제와 비슷하다는 것을 알게 되었다. 

spacefordeveloper.tistory.com/148?category=934243

 

등굣길

programmers.co.kr/learn/courses/30/lessons/42898 코딩테스트 연습 - 등굣길 계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은

spacefordeveloper.tistory.com

좀더 빨리 캐치해냈으면 좋았을 텐데 눈치없이 bfs로 푼것 같아 조금 아쉬운 부분이 있다. 

 

#include <vector>
#include <string>
#include <iostream>
#include <cstring>
using namespace std;

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int m, int n, vector<vector<int>> city_map) {
    int answer = 0;
    int dp[505][505][2]; //0: 오왼, 1: 위아래
    memset(dp,0,sizeof(dp));
    int MOD = 20170805;
    dp[1][1][0]=1; //시작지점은 무조건 1
    dp[1][1][1]=1;
    for(int i=1; i<=m; i++){
        for(int j=1; j<=n; j++){ //i 또는 j를 1부터 시작하도록 해야 i-1, j-1 seg fault 안남
            
            if(city_map[i-1][j-1]==0){
                dp[i][j][0] = (dp[i][j][0]+dp[i-1][j][1]+dp[i][j-1][0])%MOD; //기존 dp[i][j][0] 값에서 더해줘야지 기존 dp[1][1][0]=1 값을 포함시킬수 있음
                dp[i][j][1] = (dp[i][j][1]+dp[i-1][j][1]+dp[i][j-1][0])%MOD;
            }
            else if(city_map[i-1][j-1]==2){
                 dp[i][j][0] =  (dp[i][j][0]+dp[i][j-1][0])%MOD;
                 dp[i][j][1] = (dp[i][j][1]+dp[i-1][j][1])%MOD;
            }
            else{
                   dp[i][j][0]=0;
                   dp[i][j][1] =0;
            }
            
        }
        
    } 
    answer = dp[m][n][0];
    
    return answer;
}

'프로그래머스 > 동적계획법' 카테고리의 다른 글

스티커모으기2  (0) 2021.03.08
거스름돈  (0) 2021.02.23
가장 긴 팰린드롬  (0) 2021.02.17
풍선 터트리기  (0) 2021.02.05
등굣길  (0) 2021.01.29