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 |
from collections import deque
def solution(maps):
x_move = [1, 0, -1, 0]
y_move = [0, 1, 0, -1]
x_h, y_h = (len(maps[0]), len(maps))
queue = deque([(0, 0, 1)])
while queue:
x, y, d = queue.popleft()
for i in range(4):
nx = x + x_move[i]
ny = y + y_move[i]
if nx > -1 and ny > -1 and nx < x_h and ny < y_h:
if maps[ny][nx] == 1 or maps[ny][nx] > d + 1:
maps[ny][nx] = d + 1
if nx == x_h - 1 and ny == y_h - 1:
return d + 1
queue.append((nx, ny, d + 1))
return -1
#include<vector>
#include<iostream>
#include<queue>
using namespace std;
int check[101][101];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int solution(vector<vector<int> > maps)
{
int n, m;
n = maps.size();
m = maps[0].size();
queue<pair<int, int>> q;
q.push(make_pair(0, 0));
check[0][0] = true;
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 + dx[i];
int ny = y + dy[i];
if(0<=nx && nx<n && 0<=ny && ny<m){
if(check[nx][ny] == false && maps[nx][ny] > 0){
check[nx][ny] = true;
maps[nx][ny] = maps[x][y] + 1;
q.push(make_pair(nx, ny));
}
}
}
}
int answer = 0;
if(maps[n-1][m-1] == 1){
answer = -1;
}else{
answer = maps[n-1][m-1];
}
return answer;
}
import java.util.LinkedList;
import java.util.Queue;
import java.awt.Point;
class Solution {
public static int solution(int[][] maps) {
int X = maps[0].length;
int Y = maps.length;
boolean[][] visited = new boolean[Y][X];
Queue<Point> q = new LinkedList<Point>();
int x = 0;
int y = 0;
int size = 0;
int cnt = 0;
Point p = new Point();
q.add(new Point(Y-1,X-1));
while(q.isEmpty()==false) {
size = q.size();
cnt++;
for(int i=0;i<size;i++)
{
p = q.peek();
x = p.y;
y = p.x;
q.remove();
if(visited[y][x]==true)
continue;
maps[y][x] = 0;
visited[y][x] = true;
if(x==0 && y==0) {
return cnt;
}
if(x-1>-1 && maps[y][x-1]==1) { //왼쪽 한칸
q.add(new Point(y,x-1));
}
if(x+1<X && maps[y][x+1]==1) { //오른쪽 한칸
q.add(new Point(y,x+1));
}
if(y-1>-1 && maps[y-1][x]==1) { //위쪽 한칸
q.add(new Point(y-1,x));
}
if(y+1<Y && maps[y+1][x]==1) { //아래쪽 한칸
q.add(new Point(y+1,x));
}
}
}
return -1;
}
}
function solution(maps) {
var yLen = maps.length - 1;
var xLen = maps[0].length - 1;
var queue = [[0, 0]];
var visited = Array.from(new Array(maps.length), () => new Array(maps[0].length).fill(false));
var result = 0;
while (queue.length) {
result++;
var size = queue.length;
for (var i = 0; i < size; i++) {
var point = queue.shift();
var curY = point[0];
var curX = point[1];
if (visited[curY][curX]) continue;
maps[curY][curX] = 0;
visited[curY][curX] = true;
if (curY === yLen && curX === xLen) return result;
if (curY < yLen && maps[curY + 1][curX] === 1) queue.push([curY + 1, curX])
if (curX < xLen && maps[curY][curX + 1] === 1) queue.push([curY, curX + 1])
if (curY > 0 && maps[curY - 1][curX] === 1) queue.push([curY - 1, curX])
if (curX > 0 && maps[curY][curX - 1] === 1) queue.push([curY, curX - 1])
}
}
return -1;
}
python: 특이점으로 queue에 데이터를 넣을 때 x,y 및 3번째 값인 d를 활용함, deque를 활용해 가장 왼쪽 값을 popleft를 통해 추출함, 타 언어에 비해 코드가 간결하고 visited에 대한 선언을 3번째 값으로 대체함
C++: queue를 사용시 pair 객체를 활용함
Java: queue를 관리하는 방식으로 LinkedList 방식을 사용, queue에 Point 객체를 명시해 사용하는 방법을 씀
Javascript: visitied를 선언 시 Array를 통해 false값을 채워주는 방식을 사용