Algorithm/(Java) PS

[Programmers] 게임 맵 최단거리

noahkim_ 2023. 9. 24. 17:54

난이도 : Level 2

문제링크

  • 캐릭터가 상대 팀 진영까지 도착하기 위해 지나가야 하는 칸의 최소갯수를 리턴하라
  • 캐릭터맨 좌측 상단에 위치한다
  • 상대방 진영맨 우측 하단에 위치한다
  • 게임 맵에서 벽은 지나갈 수 없다

 

해설

  • 최소 비용 경로를 구해야 하기 때문에 BFS 탐색 알고리즘을 사용하여 푼다.
  • 방문한 좌표들을 큐로 넣고 큐가 비어있지 않을 때까지 반복한다.
  • 방문한 좌표에 지나온 칸 수를 같이 저장하고, 목표지에 도착시 그동안 저장했던 칸 수를 리턴한다.
import java.util.*;

class Solution {
    int[] dy, dx;
    boolean[][] visited;
        
    public int solution(int[][] maps) {
        int r_ = maps.length-1, c_ = maps[0].length-1;
        dy = new int[]{1, 0, -1, 0};
        dx = new int[]{0, 1, 0, -1};                
        
        Queue<int[]> queue = new LinkedList<>();        
        queue.offer(new int[] {0, 0, 1});
        visited = new boolean[r_+1][c_+1];
        visited[0][0] = true;
        
        while (!queue.isEmpty()) {
            int[] c = queue.poll();
            int cy = c[0], cx = c[1], ct = c[2];
            if (cy == r_ && cx == c_) {
                return ct;
            }

            for (int i = 0; i < 4; i++) {
                int ny = cy + dy[i];
                int nx = cx + dx[i];
                int nt = ct + 1;                
                             
                if (validate(ny, nx, maps)) {
                    queue.offer(new int[]{ny, nx, nt});
                    visited[ny][nx] = true;
                }
            }            
        }

        return -1;
    }
    
    private boolean validate(int y, int x, int[][] maps) {
        if (y < 0 || y > maps.length-1 || x < 0 || x > maps[0].length-1) {
            return false;
        }
        
        if (maps[y][x] == 0) {
            return false;
        }
        
        if (visited[y][x]) {
            return false;
        }
        
        return true;
    }
}
  • 효율성 테스트 통과를 위해 primitive 타입 클래스사용해야 한다.
  • class, hashset을 사용하면 통과되지 못한다.

'Algorithm > (Java) PS' 카테고리의 다른 글

[Programmers] 단어 변환  (0) 2023.09.24
[Programmers] 네트워크  (0) 2023.09.24
[Programmers] 타겟 넘버  (0) 2023.09.24
[Programmers] 도둑질  (0) 2023.09.23
[Programmers] 등굣길  (0) 2023.09.23