문제풀이/프로그래머스

[프로그래머스] 게임 맵 최단거리

Hyeon-Uk 2021. 3. 30. 23:05
반응형

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

 

코딩테스트 연습 - 게임 맵 최단거리

[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

programmers.co.kr


 

-풀이-

일반적인 최단거리를 구하는 bfs문제이다.

근데 주의를 할점이 visited[100][100] 을 전역변수가아닌 지역변수로 할당하니 효율성 테스트에서 0점이 나왔다.

전역변수로 만들어주자

 

-시간 복잡도-

bfs이므로 O(N*N)이 된다.

 

-코드-

 

#include<vector>
#include<queue>
using namespace std;

int mv[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool visited[100][100];
bool isIn(int i,int j,int n,int m){
    return i>=0&&i<n&&j>=0&&j<m;
}

int solution(vector<vector<int> > maps)
{
    queue<pair<pair<int,int>,int>> q;
   
    int n=maps.size();
    int m=maps[0].size();
    q.push({{0,0},1});
    visited[0][0]=true;
    
    while(!q.empty()){
        int i=q.front().first.first;
        int j=q.front().first.second;
        int cnt=q.front().second;
        q.pop();
        
        if(i==n-1&&j==m-1){
            return cnt;
        }
        
        for(int k=0;k<4;k++){
            int ni=i+mv[k][0];
            int nj=j+mv[k][1];
            
            if(isIn(ni,nj,n,m)&&!visited[ni][nj]&&maps[ni][nj]==1){
                q.push({{ni,nj},cnt+1});
                visited[ni][nj]=true;
            }
        }
    }
    return -1;
}
반응형