Level 2. 리코쳇 로봇
최단 거리를 구해야 하는 전형적인 BFS 문제다.
로봇을 이동시키는 것 외에 크게 번거로운 것은 없었고, 범위 검사는 unsigned 형을 사용하면 더 간편하게 할 수 있다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Point
{
unsigned r;
unsigned c;
int dist;
};
enum class DIR
{
UP,
DOWN,
LEFT,
RIGHT
};
Point moveTo(Point& p, DIR dir, vector<string>& board)
{
size_t R = board.size(), C = board.front().size();
Point pM(p);
int dr, dc;
switch (dir)
{
case DIR::UP: dr = -1; dc = 0; break;
case DIR::DOWN: dr = +1; dc = 0; break;
case DIR::LEFT: dr = 0; dc = -1; break;
case DIR::RIGHT: dr = 0; dc = +1; break;
}
while ((pM.r + dr) < R && (pM.c + dc) < C && board[pM.r + dr][pM.c + dc] != 'D')
pM.r += dr, pM.c += dc;
++pM.dist;
return pM;
}
int solution(vector<string> board)
{
size_t R = board.size(), C = board.front().size();
vector<vector<bool>> visited(R, vector<bool>(C, false));
queue<Point> que;
for (unsigned r = 0; r < R; ++r)
{
for (unsigned c = 0; c < C; ++c)
{
if (board[r][c] == 'R')
{
que.push({r, c, 0});
break;
}
}
}
while (!que.empty())
{
Point p = que.front(); que.pop();
if (board[p.r][p.c] == 'G')
return p.dist;
else if (visited[p.r][p.c])
continue;
visited[p.r][p.c] = true;
que.emplace(moveTo(p, DIR::UP, board));
que.emplace(moveTo(p, DIR::DOWN, board));
que.emplace(moveTo(p, DIR::LEFT, board));
que.emplace(moveTo(p, DIR::RIGHT, board));
}
return -1;
}
'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 3. 순위 (0) | 2023.08.08 |
---|---|
Level 2. 조이스틱 (0) | 2023.08.07 |
Level 2. 시소 짝꿍 (0) | 2023.08.05 |
Level 2. 호텔 대실 (0) | 2023.08.04 |
Level 3. 징검다리 건너기 (0) | 2023.08.03 |