
ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.
게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.
- 제한사항
- maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.
- n과 m은 서로 같을 수도, 다를 수도 있지만, n과 m이 모두 1인 경우는 입력으로 주어지지 않습니다.
maps는 0과 1로만 이루어져 있으며, 0은 벽이 있는 자리, 1은 벽이 없는 자리를 나타냅니다.
- 처음에 캐릭터는 게임 맵의 좌측 상단인 (1, 1) 위치에 있으며, 상대방 진영은 게임 맵의 우측 하단인 (n, m) 위치에 있습니다.
| arr | 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 |
입출력 예 #1
주어진 예는 다음과 같습니다.

캐릭터가 적 팀의 진영까지 이동하는 가장 빠른 길은 다음과 같습니다.

따라서 총 11칸을 캐릭터가 지나갔으므으로 11을 return 하면 됩니다.
입출력 예 #2
만약, 상대 팀이 자신의 팀 진영 주위에 벽을 세워두었다면 상대 팀 진영에 도착하지 못할 수도 있습니다. 예를 들어, 다음과 같은 경우에 당신의 캐릭터는 상대 팀 진영에 도착할 수 없습니다.

- 큐의 첫 번째 값을 기억하고
queue.pop().- 큐의 첫 번째 값이 목표 위치라면, 이동거리
dist값 리턴- dy, dx값을 사용해 사방의 칸을 살펴본다.
2차원 배열 내부에 있는 칸이고, 방문하지 않았으며, 갈 수 있는 길이라면,
해당 칸의 좌표를queue.push(), 해당 칸의 방문 여부를true, 해당 칸의dist값을 1 증가 시킨 값으로 대입
return -1
#include <vector>
#include <queue>
using namespace std;
/*
2차원배열은 (y,x)라 생각하며 편하다.
int dy[4] = { -1, 1 ,0, 0};
int dx[4] = { 0, 0, -1, 1 };
(dy[i], dx[i]) 를 사용하면 현재 위치를 기준으로 각각 (상, 하, 좌, 우) 셀을 볼 수 있다.
방문했던 셀은 방문했음을 기록하지 않으면 무한루프를 만날 수 있음.
map.size() == row 길이
map[0].size() == column 길이
*/
int solution(vector<vector<int> > maps)
{
int y = maps.size();
int x = maps[0].size();
int dy[4] = { -1, 1 ,0, 0};
int dx[4] = { 0, 0, -1, 1 };
vector<vector<bool>> visited(y, vector<bool>(x, false));
vector<vector<int>> dist(y, vector<int>(x, -1));
queue<pair<int, int>> q;
q.push({0, 0});
visited[0][0] = true;
dist[0][0] = 1;
while(!q.empty())
{
pair<int, int> LocalPosition = q.front();
int PosY = LocalPosition.first;
int PosX = LocalPosition.second;
q.pop();
if(PosY == y - 1 && PosX == x - 1)
{
return dist[PosY][PosX];
}
for(int i = 0; i < 4; i++)
{
int ny = PosY + dy[i];
int nx = PosX + dx[i];
if(ny >= 0 && ny < y && nx >=0 && nx < x && /*갈수있는길인지*/maps[ny][nx] == 1 && !visited[ny][nx])
{
visited[ny][nx] = true;
dist[ny][nx] = dist[PosY][PosX] + 1;
q.push({ny,nx});
}
}
}
return -1;
}
위의 코드는 스터디 팀원인 의진님이 설명하며 함께 받아적은 코드다. 이 코드를 읽으며 작동 방식을 이해했다. BFS가 어떤 방식인지, 이 문제를 혼자 다시 푸는 것은 가능했다만, 다른 문제에 내가 적용할 수 있을지는 모르겠다.