[백준 1261] 알고스팟(Java)

최민길(Gale)·2023년 8월 28일
0

알고리즘

목록 보기
119/172

문제 링크 : https://www.acmicpc.net/problem/1261

이 문제는 다익스트라 알고리즘을 이용하여 풀 수 있습니다. 문제를 읽었을 때 벽을 부수는 방식을 카운트하여 BFS 등으로 풀 수도 있겠지만 벽을 부수는 경우 가중치를 1로, 벽을 부수지 않을 경우 가중치를 0으로 하는 그래프로 생각한다면 쉽게 풀 수 있습니다. 최단 거리 배열을 초기화한 후 상하좌우로 이동하면서 최단거리 배열값보다 현재 위치의 벽을 부순 횟수가 더 크면 값을 대체하고 큐에 추가하는 방식으로 풀 수 있습니다.

다음은 코드입니다.

import java.util.*;
import java.io.*;

class Main{
    static int N,M;
    static int[][] map;
    static int[][] distance;
    static int[] dy = {1,0,-1,0}, dx = {0,1,0,-1};

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        map = new int[N][M];
        for(int i=0;i<N;i++){
            String str = br.readLine();
            for(int j=0;j<M;j++){
                map[i][j] = str.charAt(j)-'0';
            }
        }

        distance = new int[N][M];
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                distance[i][j] = Integer.MAX_VALUE;
            }
        }

        PriorityQueue<Node> queue = new PriorityQueue<>();
        distance[0][0] = 0;
        queue.add(new Node(0,0,0));
        while(!queue.isEmpty()){
            Node curr = queue.poll();

            for(int i=0;i<4;i++){
                int ny = curr.y + dy[i];
                int nx = curr.x + dx[i];
                int val = curr.val;
                if(ny<0 || ny>=N || nx<0 || nx>=M) continue;

                if(map[ny][nx]==1) val++;
                if(distance[ny][nx] > val){
                    distance[ny][nx] = val;
                    queue.add(new Node(ny,nx,val));
                }
            }
        }

        System.out.println(distance[N-1][M-1]);
    }

    static class Node implements Comparable<Node>{
        int y;
        int x;
        int val;

        Node(int y, int x, int val){
            this.y = y;
            this.x = x;
            this.val = val;
        }

        @Override
        public int compareTo(Node o) {
            return this.val - o.val;
        }
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글