Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- springboot
- 2206번
- 코딩테스트
- Adapater Pattern
- 백준
- Dxerr.h
- Design Patterns
- java
- 자바의 정석
- 2166번
- 2156번
- 11758번
- 1300번
- 17장
- BOJ
- SerialDate 리펙터링
- 10830번
- 1043번
- 11286번
- java의 정석
- DxTrace
- 가장 긴 증가하는 부분 수열2
- 9장
- 코딩 테스트
- 클린코드
- 프로그래머스
- programmers
- 냄새와 휴리스틱
- Spring
- Design Pattern
Archives
- Today
- Total
Don't give up!
[프로그래머스] 게임 맵 최단거리 (java) 본문
코딩테스트 연습 - 게임 맵 최단거리 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
그래프 탐색이므로 DFS 또는 BFS를 사용해야 겠다고 생각이 들었습니다.
DFS를 사용할 경우 모든 경로를 탐색한 후 거리들을 비교하여 최소값을 반환하여 해결할 수 있지만
BFS는 먼저 목적지에 도달한 경로가 최단 거리의 경로이므로 더 빠르게 결과를 얻을 수 있다고 생각했습니다.
코드
import java.util.Queue;
import java.util.LinkedList;
class Solution {
final int[] px = {-1,0,1,0}, py = {0,-1,0,1};
private class Tile{
int x;
int y;
int meter;
Tile(int x, int y, int meter){
this.x = x;
this.y = y;
this.meter = meter;
}
}
public int solution(int[][] maps) {
int rows = maps.length;
int columns = maps[0].length;
boolean[][] visited = new boolean[rows][columns];
Queue<Tile> queue = new LinkedList<>();
queue.offer(new Tile(0,0,1));
while(!queue.isEmpty()){
Tile current = queue.poll();
if(current.x == rows-1 && current.y == columns-1) return current.meter;
for(int i=0; i<4; i++){
int nx = current.x + px[i];
int ny = current.y + py[i];
if(nx>=0 && nx<rows && ny>=0 && ny<columns){
if(maps[nx][ny]==1 && !visited[nx][ny]){
visited[nx][ny] = true;
queue.offer(new Tile(nx,ny,current.meter+1));
}
}
}
}
return -1;
}
}
BFS를 구현하기 위해 이동할 타일 정보를 Queue에 삽입하고, 이동가능한 타일이 없을 때까지 반복하도록 코드를 작성하였습니다.
목적지에 도달한 경우 이동한 거리를 즉시 반환함으로서 원하는 결과를 얻을 수 있고 Queue를 모두 순회할 때까지 목적지에 도착하지 못한 경우 갈 수 없음을 의미하므로 -1을 반환합니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 멀쩡한 사각형 (java) (0) | 2021.05.09 |
---|---|
[프로그래머스] H-Index(java) (0) | 2021.05.07 |
[프로그래머스] 타겟 넘버(java) (0) | 2021.05.06 |