C# 리코쳇 로봇 - BFS / 프로그래머스 [Lv.2]
- 코딩 테스트
- 2023. 4. 29. 16:13
출처: 프로그래머스 코딩 테스트 연습
https://school.programmers.co.kr/learn/courses/30/lessons/169199
나의 풀이
public int solution(string[] board)
{
(int y, int x) target = (-1, -1);
var open = new Queue<(int, int)>();
var dist = new int[board.Length, board[0].Length];
// 초기 세팅
for(int y = 0; y < board.Length; ++y)
{
for(int x = 0; x < board[0].Length; ++x)
{
if(board[y][x] == 'D')
dist[y, x] = -1;
else if(board[y][x] == 'R')
open.Enqueue((y, x));
else if(board[y][x] == 'G')
target = (y, x);
}
}
// 탐색
int[] dy = new int[4]{ -1, 1, 0, 0 };
int[] dx = new int[4]{ 0, 0, -1, 1 };
while(open.Count > 0)
{
(int y, int x) point = open.Dequeue();
if(point.y == target.y && point.x == target.x) // 도착
break;
int curDist = dist[point.y, point.x];
for(int i = 0; i < 4; ++i) // 4방향으로
{
int y = point.y;
int x = point.x;
while(true) // 벽 혹은 가장자리를 만날 때까지 최대로 미끄러진다.
{
int nextY = y + dy[i];
int nextX = x + dx[i];
if(nextY < 0 || nextY >= board.Length) break;
if(nextX < 0 || nextX >= board[0].Length) break;
if(board[nextY][nextX] == 'D') break;
y = nextY;
x = nextX;
}
if(y == point.y && x == point.x) // 진행하지 못한경우 취소
continue;
if(dist[y, x] == 0)
{
open.Enqueue((y, x));
dist[y, x] = curDist + 1; // visited를 겸함
}
}
}
return dist[target.y, target.x] > 0 ? dist[target.y, target.x] : -1;
}
평범한 BFS에서 이동 시 미끄러진다는 부분만 다르다.
기존 베이스는 DFS와 동일한데, while문에서 진행이 불가능할 때까지 선택한 방향으로 이동한 뒤,
진행하지 못했거나 이미 방문한 좌표라면 continue 하고,
처음 만난 좌표라면 큐에 넣어준다.
'코딩 테스트' 카테고리의 다른 글
C# 이중우선순위큐 / 프로그래머스 [Lv.3] (0) | 2023.05.01 |
---|---|
C# 이모티콘 할인행사 - DFS / 프로그래머스 [Lv.2] (0) | 2023.04.30 |
C# 디펜스 게임 - 최소 정렬 / 프로그래머스 [Lv.2] (0) | 2023.04.19 |
C# 택배 배달과 수거하기 - 그리디 / 프로그래머스 [Lv.2] (1) | 2023.04.16 |
C# 과제 진행하기 - Stack / 프로그래머스 [Lv.2] (0) | 2023.04.15 |