문제 출처 - Programmers
문제는 여기
[풀이]
1. 4방 탐색을 위한 dx, dy 배열을 만들어준다.
2. 방문체크를 위한 배열을 만들어준다.
3. 시작위치를 1로 만들어 방문 체크를 해준다.
4. bfs 탐색을 한다.
5. 범위를 벗어나는지, 방문 했는지, 갈 수 있는 곳인지를 체크한다.
6. 체크해서 문제가 없다면 해당 위치까지 방문한 수 + 1을 넣어준다.
7. bfs를 추가적으로 탐색한다.
8. 결과를 answer에 넣는다.
9. answer이 0이라면 도착할 수 없는 곳이므로 -1로 넣어준다.
10. 결과를 출력한다.
[접근]
1. BFS를 사용해서 맵을 탐색하면 되겠다고 생각하였다.
[코드]
import java.util.*;
class Solution {
int[] dx = {0, 0, 1, -1};
int[] dy = {-1, 1, 0, 0};
public int solution(int[][] maps) {
int answer = 0;
int[][] visited = new int[maps.length][maps[0].length];
visited[0][0] = 1; // 시작 위치 방문체크
// bfs 탐색
bfs(maps, visited);
// 도착지 값을 넣어주기
answer = visited[maps.length - 1][maps[0].length - 1];
// 갈 수 없다면 -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});
while (!q.isEmpty()) {
int[] now = q.poll();
int x = now[0];
int y = now[1];
// 4방탐색
for (int i = 0; i < 4; i++) {
// 이동했을 때 위치
int nx = x + dx[i];
int ny = y + dy[i];
// 범위 벗어나는지 체크
// 방문했는지 체크
// 갈 수 있는지 체크
if (nx >= 0 && nx < maps.length && ny >= 0 && ny < maps[0].length
&& visited[nx][ny] == 0 && maps[nx][ny] == 1) {
// 방문했다고 체크해주기
visited[nx][ny] = visited[x][y] + 1;
// 큐에 넣기
q.add(new int[]{nx, ny});
}
}
}
}
}
'문제 풀이 > Programmers' 카테고리의 다른 글
[프로그래머스] 전화번호 목록 (JAVA) (0) | 2022.04.29 |
---|---|
[프로그래머스] JadenCase 문자열 만들기 (JAVA) (0) | 2022.04.27 |
[프로그래머스] 피보나치 수 (JAVA) (0) | 2022.04.25 |
[프로그래머스] 최솟값 만들기 (0) | 2022.04.24 |
[프로그래머스] 영어 끝말잇기 (JAVA) (0) | 2022.04.22 |