STUDY/Coding
[프로그래머스] 게임 맵 최단거리
sohexz
2024. 3. 22. 10:56
[오답노트 | 파이썬] 프로그래머스 - 게임 맵 최단거리
프로그래머스 Lv.2 게임 맵 최단거리 오답노트
velog.io
https://blackvill.tistory.com/177
[프로그래머스] 게임 맵 최단거리 (JAVA)
문제 출처 - Programmers 문제는 여기 코딩테스트 연습 - 게임 맵 최단거리 [[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 programmers.co.kr [풀이] 1. 4
blackvill.tistory.com
- 모든 정점을 방문해야 할 때: 둘 다 O
- 경로의 특징을 저장해 둬야 할 때: DFS
- 최단 거리를 구해야 할 때: BFS
- 그래프의 규모가 정말 클 때: DFS
- 그래프의 규모가 크지 않고, 시작 지점으로부터 대상이 멀지 않을 때: BFS
- 두 가지 일이 동시에 벌어질 때: BFS
참고한 코드
import java.util.*;
class Solution {
// 상하좌우 이동할 수 있는 좌표
int[] dx = {0, 1, -1, 0};
int[] dy = {1, 0, 0, -1};
public int solution(int[][] maps) {
int answer = 0;
int[][] visited = new int[maps.length][maps[0].length];
bfs(maps, visited);
answer = visited[maps.length - 1][maps[0].length - 1]; // 상대 팀 진영 좌표
if (answer == 0) { // 상대 팀 진영에 도달하지 못한 경우
answer = -1;
}
return answer;
}
public void bfs(int[][] maps, int[][] visited) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{0, 0}); // Queue에 시작 정점 추가
visited[0][0] = 1;
while (!q.isEmpty()) { // 더 나아갈 정점이 없을 때까지 반복
int[] current = q.poll(); // 정점 하나 꺼내기
int X = current[0];
int Y = current[1];
for (int i = 0; i < 4; i++) {
int nX = X + dx[i];
int nY = Y + dy[i];
// 좌표가 maps에서 벗어날 경우 다음 반복으로 넘어간다
if (nX < 0 || nX > maps.length - 1 || nY < 0 || nY > maps[0].length - 1) {
continue;
}
// 아직 방문하지 않았고, 벽이 아닐 경우
if (visited[nX][nY] == 0 && maps[nX][nY] == 1) {
visited[nX][nY] = visited[X][Y] + 1;
q.add(new int[]{nX, nY});
}
}
}
}
}