Coding Test/programmers

[프로그래머스] 게임 맵 최단거리 c++, python

owls 2023. 2. 17. 19:07
728x90

문제 설명

게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.

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

 

프로그래머스

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

programmers.co.kr

제한 사항

  • maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.
    • n과 m은 서로 같을 수도, 다를 수도 있지만, n과 m이 모두 1인 경우는 입력으로 주어지지 않습니다.
  • maps는 0과 1로만 이루어져 있으며, 0은 벽이 있는 자리, 1은 벽이 없는 자리를 나타냅니다.
  • 처음에 캐릭터는 게임 맵의 좌측 상단인 (1, 1) 위치에 있으며, 상대방 진영은 게임 맵의 우측 하단인 (n, m) 위치에 있습니다.

입출력 예

maps answer
[[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

풀이

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

int n, m;
vector<vector<int>> board;
queue<pair<int, int>> Q;

void bfs(vector<vector<int>> &maps){
    vector<int> dist{1, 0, -1, 0, 1};
    while(!Q.empty()){
    	int x = Q.front().first;
    	int y = Q.front().second;
    	Q.pop();
    	
        for(int i = 0; i < 4; i++){
        	int nx = x + dist[i];
        	int ny = y + dist[i+1];
        	if(nx < 0 || nx >= n || ny < 0 || ny >= m || board[nx][ny] > 0 || maps[nx][ny] == 0){
            	continue;
        	}
        	board[nx][ny] += board[x][y] + 1;
        	Q.push({nx, ny});
    	}
    }
}

int solution(vector<vector<int> > maps)
{
    int answer = 0;
    n = maps.size();
    m = maps[0].size();
    board.resize(n+1, vector<int>(m+1, 0));
    
    Q.push({0, 0});
    bfs(maps);
   
    answer = board[n-1][m-1];
    if(answer == 0){
        return -1;
    }
    
    return answer + 1;	//(0, 0) 시작 지점은 카운트 안했기에 1더한다.
}

 

python

from collections import deque

def solution(maps):
    
    n = len(maps)
    m = len(maps[0])
    
    board = [[0]*m for _ in range(n)]
    
    board[0][0] = 1
    board[n-1][m-1] = -1
    
    queue = deque([(0, 0)])
    
    dx = [0, 0, 1, -1]
    dy = [1, -1, 0, 0]
    
    while queue:
        row, col = queue.popleft()
        for i in range(4):
            nr = row + dy[i]
            nc = col + dx[i]
            if nr < 0 or nc < 0 or nr >= n or nc >= m:
                continue
            if maps[nr][nc] == 0:
                continue
            if board[nr][nc] > 0:
                continue
            
            board[nr][nc] = board[row][col] + 1
            queue.append((nr, nc))
            
    return board[n-1][m-1]
728x90