백준 온라인 저지/Gold

[BOJ] 2412 - 암벽 등반

jooona 2022. 7. 31. 17:08
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

https://www.acmicpc.net/problem/2412

 

2412번: 암벽 등반

어떤 암벽에 n(1 ≤ n ≤ 50,000)개의 홈이 파져 있다. 각각의 홈의 좌표는 (x, y)와 같이 표현되는데, |a - x| ≤ 2이고 |b - y| ≤ 2이면 (x, y)에서 (a, b)로 이동할 수 있다. 이와 같이 홈들을 이용하여 이동

www.acmicpc.net

난이도: 골드 3

사용언어: JAVA

 

풀이

 

기본적인 BFS를 사용하면 쉽게 해결할 수 있는 문제입니다.

 

단, 다음의 문장만 유의해서 풀이를 하시면 됩니다.

 

각각의 홈의 좌표는 (x, y)와 같이 표현되는데, |a - x| ≤ 2이고 |b - y| ≤ 2이면 (x, y)에서 (a, b)로 이동할 수 있다. 

 

BFS를 수행하면서 이동할 홈의 x, y 값을 항상 검사하면서 진행하면 됩니다.

 

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
import java.util.*;
import java.io.*;
 
public class Main {
 
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int N, T;
 
    static class node{
        int x; // x좌표
        int y; // y좌표
        boolean visit; // 해당 홈에 대한 방문 여부
 
        node(int x, int y, boolean v){
            this.x = x;
            this.y = y;
            this.visit = v;
        }
    }
 
    static ArrayList<ArrayList<node>> list = new ArrayList<>(); // 홈의 위치를 저장할 2차원 ArrayList
    static Queue<node> q = new LinkedList<>(); //BFS용 Queue
 
    public static void main(String[] args) throws IOException {
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        T = Integer.parseInt(st.nextToken());
 
        for (int i = 0; i <= T; i++) {
            list.add(new ArrayList<>());
        }
 
        for (int i = 0; i < N; i++) { // 입력
            st = new StringTokenizer(br.readLine());
 
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
 
            list.get(y).add(new node(x, y, false)); // ArrayList에 홈의 좌표 정보 기입
        }
 
        q.add(new node(0,0,false)); // 최초 0,0에서 출발
        int cnt = 0;
        while(!q.isEmpty()){
            int qsize = q.size();
 
            for (int i = 0; i < qsize; i++) {
                node now = q.poll();
                if(now.y == T){ // 암벽의 꼭대기에 도착
                    bw.write(String.valueOf(cnt));
                    bw.flush();
                    bw.close();
                    br.close();
                    System.exit(0); // 종료
                }
 
                for (int j = now.y - 2; j <= now.y + 2; j++) { // |b - y| ≤ 2이면 (x, y)에서 (a, b)로 이동할 수 있다. 
                    if(j < 0 || j > T){
                        continue;
                    }
 
                    for (int k = 0; k < list.get(j).size(); k++) {
                        node next = list.get(j).get(k);
 
                        if(Math.abs(now.x - next.x) <= 2 && next.visit == false){ // |a - x| ≤ 2이면 (x, y)에서 (a, b)로 이동할 수 있다, 방문 체크
                            next.visit = true// 방문 여부 업데이트
                            q.add(next); 
                        }
                    }
                }
            }
 
            cnt++;
        }
 
        bw.write("-1");
        bw.flush();
        bw.close();
        br.close();
    }
}
 
cs

 

 

 

반응형

'백준 온라인 저지 > Gold' 카테고리의 다른 글

[BOJ] 16437 - 양 구출 작전  (0) 2022.07.30
[BOJ] 5430 - AC  (0) 2022.02.09
[BOJ] 3078 - 좋은 친구  (0) 2022.02.03
[BOJ] 2116 - 주사위 쌓기  (0) 2022.01.31
[BOJ] 10423 - 전기가 부족해  (2) 2021.10.21