반응형
백준 16928번 문제 - 뱀과 사다리 게임
16928번: 뱀과 사다리 게임
첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으
www.acmicpc.net
문제 분석
- 게임은 정육면체 주사위를 사용하며, 주사위의 각 면에는 1부터 6까지 수가 하나씩 적혀있다.
- 총 100개의 칸으로 나누어져 있는 보드판에서 진행된다.
- 보드판에는 1부터 100까지 수가 하나씩 순서대로 적혀져 있다.
- 플레이어는 주사위를 굴려 나온 수만큼 이동
- 만약 주사위를 굴린 결과가 100번 칸을 넘어간다면 이동할 수 없다.
- 도착한 칸이 사다리면, 사다리를 타고 위로 이동
- 뱀이 있는 칸에 도착하면, 뱀을 따라서 아래로 이동
- 게임의 목표는 1번 칸에서 시작해서 100번 칸에 도착하는 것이다.
이 때, 100번 칸에 도착하기 위해 주사위를 굴려야하는 횟수의 최솟값을 출력해라.
해결 포인트
- BFS 사용
- 사다리, 뱀 이동을 Map에 저장
- count를 저장하는 배열에 각 위치에 최소 횟수를 저장한다.
- 방문 체크한다
- 사다리를 타거나, 뱀을 통해 이동할 경우 방문 확인 하지않고 무조건 이동한다.
- BFS 진행할 때 두개의 큐를 시용한다.
- 다음 이동을 나타내는 큐(queue)와 사다리나 뱀으로 현재 바로 이동을 나타내는 큐(nextQueue)
- 이유는 바로 이동을 나타내는 큐일 경우는 count를 증가시키기 전에 확인을 끝내야하기 때문이다.
코드
import java.awt.*;
import java.io.*;
import java.util.*;
public class Main {
public static HashMap<Integer, Integer> ladders, snakes;
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());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
ladders = new HashMap<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
ladders.put(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
snakes = new HashMap<>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
snakes.put(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
bw.write(BFS(N) + "\n");
bw.flush();
bw.close();
}
public static int BFS(int N) {
Queue<Integer> queue = new LinkedList<>();
Queue<Integer> nextQueue = new LinkedList<>();
boolean [] visit = new boolean[101];
int [] counts = new int[101];
queue.add(1);
visit[1] = true;
int count = 0;
while (!queue.isEmpty()) {
int queueSize = queue.size();
int nextQueueSize = 0;
for (int i = 0; i < queueSize+nextQueueSize; i++) {
int value;
if(i < queueSize) value = queue.poll();
else value = nextQueue.poll();
if(ladders.containsKey(value)) {
int next = ladders.get(value);
counts[next] = count;
visit[next] = true;
nextQueue.add(next);
nextQueueSize++;
continue;
}
if(snakes.containsKey(value)) {
int next = snakes.get(value);
counts[next] = count;
visit[next] = true;
nextQueue.add(next);
nextQueueSize++;
continue;
}
for (int j = 1; j <= 6; j++) {
if(value + j <= 100 && !visit[value+j]) {
counts[value+j] = count+1;
visit[value+j] = true;
queue.add(value+j);
}
}
}
count++;
}
return counts[100];
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 5430] AC (JAVA) (1) | 2024.01.06 |
---|---|
[백준 1107] 리모컨(JAVA) (1) | 2024.01.02 |
[백준 10026] 적록색약 (JAVA) (1) | 2024.01.02 |
[백준 6064] 카잉 달력 (JAVA) (1) | 2023.12.28 |
[백준 1389] 케빈 베이컨의 6단계 법칙 (JAVA) (1) | 2023.12.28 |