본문 바로가기
🧑‍💻코딩 테스트/백준 (BOJ)

[코딩테스트/백준 알고리즘] 16928번 - 뱀과 사다리 게임

by 코코의 주인 2023. 5. 15.

문제

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

 

16928번: 뱀과 사다리 게임

첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으

www.acmicpc.net


문제 설명


문제 풀이

사다리나 뱀을 타고 도착한 곳에도 다른 사다리나 뱀이 연결되어 있을 수도 있다는 것을 기억하자.


코드

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

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[] visit = new int[101];
        Arrays.fill(visit, Integer.MAX_VALUE);
        Map<Integer, Integer> map = new HashMap<>();

        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            map.put(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }
        for(int j = 0; j < M; j++) {
            st = new StringTokenizer(br.readLine());
            map.put(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }
        Queue<Integer> q = new LinkedList<>();
        q.offer(1);
        visit[1] = 0;
        while(!q.isEmpty()) {
            int current = q.poll();
            while(map.containsKey(current)) {
                current = map.get(current);
            }
            for (int i = 1; i <= 6; i++) {
                int next = current + i;
                if (next <= 100) {
                    if (map.containsKey(next)) {
                        next = map.get(next);
                        if(visit[next] > visit[current] + 1) {
                            q.offer(next);
                            visit[next] = visit[current] + 1;
                        }

                    } else {
                        if(visit[next] > visit[current] + 1) {
                            q.offer(next);
                            visit[next] = visit[current] + 1;
                        }
                    }
                }
            }
        }
        System.out.println(visit[100]);
    }
}

댓글