PROBLEM/PROGRAMMERS

[PRO] 게임 맵 최단거리 | Java

Eunjng 2023. 6. 13. 20:58

문제

프로그래머스 코딩테스트 연습 > 깊이/너비 우선 탐색(DFS/BFS) > 게임 맵 최단거리

https://school.programmers.co.kr/learn/courses/30/lessons/1844

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 알고리즘 분류 : 너비 우선 탐색(BFS)

 

 

풀이 과정

자바 풀이

import java.util.*;

class Solution {
    public int solution(int[][] maps) {
        int answer = 0;
        int[][] visited = new int[maps.length][maps[0].length];
        // 방문 여부를 확인하기 위한 maps와 동일한 크기의 이차원 배열 생성
		
		bfs(maps, visited);
		answer = visited[maps.length-1][maps[0].length-1];
        // 오른쪽 하단 위치가 최종 위치이므로
        // visited의 해당 위치에 적힌 숫자가 최단거리
        // 만약 0이면 갈 수 없는 경우이므로 -1
		if(answer==0)
			answer = -1;
        return answer;
    }
    
	static void bfs(int[][] maps, int[][] visited) {
		int[] dx = {-1, 1, 0, 0};
		int[] dy = {0, 0, -1, 1};
        // 상하좌우 네 가지 방향에 대해 탐색 
		
		visited[0][0] = 1;
		Queue<int[]> q = new LinkedList<>();
		q.add(new int[]{0, 0});
        // queue에 처음 위치인 (0, 0) 추가 
		
		while(!q.isEmpty()) {
			int[] rm = q.remove();
			int x = rm[0];
			int y = rm[1];
			
			for(int d=0; d<4; d++) {
				int nx = x + dx[d];
				int ny = y + dy[d];
				
                // 네 가지 방향으로 이동하는 경우를 탐색하는데 
                // 범위 벗어나면 continue
				if(nx<0 || nx>=maps.length || ny<0 || ny>=maps[0].length)
					continue;
				
                // 간 적 없고, 벽이 없어서 갈 수 있는 위치면
                // 이전 까지의 거리 + 1해서 방문 기록 남기고, q에 추가 
				if(visited[nx][ny]==0 && maps[nx][ny]==1) {
					visited[nx][ny] = visited[x][y] + 1;
					q.add(new int[] {nx, ny});
				}
			}
		}
	}
}
  • BFS/DFS를 파이썬으로만 풀다가 자바로는 처음 풀었는데, queue 사용법에서 조금 헤맸지만, 나머지는 거의 유사했다.
  • 자바로 dfs/bfs 문제 조금 더 풀어보면서 완전히 익숙해져야 겠다.