코테/백준

[백준/JAVA] 1261번: 알고스팟

imname1am 2023. 9. 1. 21:34
반응형

🔺 문제

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

 

 

🔺 코드

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.*;
import java.io.*;
 
class Node implements Comparable<Node> {
    int x, y, val;
    
    public Node(int x, int y, int val) {
        this.x = x;
        this.y = y;
        this.val = val;
    }
    
    // 벽 부순 개수 기준 오름차순 정렬
    @Override
    public int compareTo(Node o) {
        return this.val - o.val;
    }
}
 
public class Main {
    static int[] dx = {0,0,-1,1};
    static int[] dy = {1,-1,0,0};
    
    static int M, N;
    static int min = Integer.MAX_VALUE;
    
    static int[][] map;
    static boolean[][] visited;
    
    public static void main(String[] args) throws IOException {
        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 + 1][M + 1];
        visited = new boolean[N + 1][M + 1];
        
        for(int i = 1 ; i <= N ; i++) {
            String str = br.readLine();
            for(int j = 1 ; j <= M ; j++) {
                map[i][j] = str.charAt(j - 1- '0';
            }
        }
        
        System.out.println(bfs(11));
    }
    
    private static int bfs(int a, int b) {
        visited[a][b] = true;
        
        // 벽 부순 개수 기준 오름차순 정렬
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.add(new Node(a, b, 0));
        
        while(!pq.isEmpty()) {
            Node now = pq.poll();
            
            // 도착한 경우, 종료
            if(now.x == N && now.y == M) {
                return now.val;
            }
            
            for(int d = 0 ; d < 4 ; d++) {
                int nx = now.x + dx[d];
                int ny = now.y + dy[d];
                
                if(nx < 1 || ny < 1 || nx > N || ny > M || visited[nx][ny])   continue;
                
                if(!visited[nx][ny]) {
                    visited[nx][ny] = true;
                    
                    if(map[nx][ny] == 0) {
                        pq.add(new Node(nx, ny, now.val));
                    }
                    else {
                        pq.add(new Node(nx, ny, now.val + 1)); // 벽 부순 개수 업데이트
                    }
                }
            }
        }
        
        return 0;
    }
}
cs
✅ 해결 아이디어
✔ 다익스트라
- 일반 큐 아닌 우선순위 큐 사용

 

💥 유의사항

 BFS를 사용하면서, 일반 큐가 아닌 우선순위 큐 사용!

  ⇨ 최단 거리가 필요한 게 아닌, 벽을 최소한으로 부수면서 가라고 했기 때문

  ⇨ 그래서 벽을 부순 개수에 대해 오름차순 정렬하면서 poll 함

 


🔺 다른 풀이들

- Deque를 사용하셨다.

 

[백준 - Java] 1261번 : 알고스팟

문제 www.acmicpc.net/problem/1261 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주

minhamina.tistory.com


💬 느낀 점

와 다익스트라 잊고 있었는데...

다익스트라 문제들을 또 풀러 가야겠다..

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[BOJ] 백준 1261번 : 알고스팟 (JAVA)

문제의 링크 : https://www.acmicpc.net/problem/1261 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는

steady-coding.tistory.com

 

반응형