본문 바로가기
알고리즘

[JAVA]백준 16928번: 뱀과 사다리 게임

by Kwoncorin 2021. 8. 23.
728x90

 

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

1. 문제 설명

 

뱀과 사다리게임 판의 상태가 주어졌을 때, 100번 칸에 도착하기 위해 주사위를 굴려야 하는 횟수의 최솟값을 구해보자.

 

2. 풀이

 

BFS로 풀 수 있다.

 

1부터 시작하여 주사위 (1~6까지)를 굴러가며 이동한다.

움직이는 위치에 사다리/뱀이 있는 경우 그 자리로 이동한다.

이미 방문하지 않았던 경우만 BFS 탐색을 진행해나가면서 100에 처음으로 도착하는 움직이는 횟수를 출력한다.

 

3. 코드

// JAVA 11, 시간 : 144ms , 메모리 : 14260KB


import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    // 게임판 상황 파악
    public static int[] map = new int[101];
    // 방문 체크
    public static boolean[] visited = new boolean[101];
    // 사다리 개수, 뱀 개수
    public static int ladderNum, snakeNum;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());

        ladderNum = Integer.parseInt(st.nextToken());
        snakeNum = Integer.parseInt(st.nextToken());

        for (int x = 0; x < ladderNum+snakeNum; x++) {
            st = new StringTokenizer(br.readLine());

            map[Integer.parseInt(st.nextToken())] = Integer.parseInt(st.nextToken());

        }

        Queue<Integer> queue = new LinkedList<>();

        queue.add(1);
        visited[1]=true;

        int answer = 0;
        boolean find=false;

        while (!queue.isEmpty()) {
            int size = queue.size();


            for (int x = 0; x < size; x++) {
                int now = queue.poll();

                // 100 도착
                if (now == 100) {
                    find=true;
                    break;
                }

                for (int y = 1; y <= 6; y++) {
                    // 100번 칸을 넘어가면 이동할 수 없음 -> 100번 칸 이하로 이동 가능
                    if(now+y<=100){

                        int next = now + y;

                        // 사다리나 뱀이 있는 경우 타고 이동
                       if (map[next] > 0) {
                            next = map[next];
                        }

                       // 이전에 방문하지 않았던 경우만 이동
                        if(!visited[next]){
                            visited[next]=true;
                            queue.add(next);
                        }
                    }
                }
            }
            if(find)
                break;

            answer++;
        }

        bw.write(String.valueOf(answer));

        bw.flush();

    }
}
728x90

'알고리즘' 카테고리의 다른 글

[JAVA]백준 4179번: 불!  (0) 2021.08.26
[JAVA]백준 12919번: A와 B 2  (0) 2021.08.24
[JAVA]백준 17413번: 단어 뒤집기 2  (0) 2021.08.23
[JAVA]백준 13699번: 점화식  (0) 2021.08.23
[JAVA]백준 20207번: 달력  (0) 2021.08.19