목차
- 문제
- 내가 푼 방법
- 자바 코드
- 결과 및 회고
1. 문제
https://www.acmicpc.net/problem/16928
2. 내가 푼 방법
전형적인 BFS 알고리즘 문제이다. 현재 칸이 뱀 혹은 사다리가 있는 칸이라면 이어진 칸으로 이동하고, 뱀 혹은 사다리가 없는 칸이라면 주사위를 굴려서 이동하면 된다.
Tuple 클래스는 현재 번호인 v와, 주사위를 굴린 횟수인 cnt를 포함하고 있고, cnt가 작은 값을 높은 우선순위로 설정해 주었다. 그 후, 우선순위 큐에 Tuple 클래스를 넣어 100까지 도착하도록 했다.
public static void solution() {
result = Integer.MAX_VALUE;
play();
}
public static void play() {
PriorityQueue<Tuple> queue = new PriorityQueue<>();
queue.add(new Tuple(1, 0));
boolean[][] visit = new boolean[LEN][LEN+1];
while (!queue.isEmpty()) {
Tuple tuple = queue.poll();
int v = tuple.v;
int x = v / LEN;
int y = v % LEN + 1;
int cnt = tuple.cnt;
if (v == LEN*LEN) {
result = cnt;
break;
}
if (v > LEN*LEN || visit[x][y]) continue;
else visit[x][y] = true;
// 사다리, 뱀 없음
if (arr[x][y] == 0) {
for (int i = 1; i <= 6; i++) {
queue.add(new Tuple(v + i, cnt+1));
}
}
else {
queue.add(new Tuple(arr[x][y], cnt));
}
}
}
public static class Tuple implements Comparable<Tuple>{
int v;
int cnt;
public Tuple(int v, int cnt) {
this.v = v;
this.cnt = cnt;
}
@Override
public int compareTo(Tuple t) {
return this.cnt - t.cnt;
}
}
3. 자바 코드
깃허브 풀이 주소
https://github.com/geujeog/BOJ/blob/main/B16928.java
import java.util.*;
import java.io.*;
class B16928 {
static int LEN = 10;
static int[][] arr;
static int result;
public static void main (String[] args) throws IOException {
init();
solution();
print();
}
public static void solution() {
result = Integer.MAX_VALUE;
play();
}
public static void play() {
PriorityQueue<Tuple> queue = new PriorityQueue<>();
queue.add(new Tuple(1, 0));
boolean[][] visit = new boolean[LEN][LEN+1];
while (!queue.isEmpty()) {
Tuple tuple = queue.poll();
int v = tuple.v;
int x = v / LEN;
int y = v % LEN + 1;
int cnt = tuple.cnt;
if (v == LEN*LEN) {
result = cnt;
break;
}
if (v > LEN*LEN || visit[x][y]) continue;
else visit[x][y] = true;
// 사다리, 뱀 없음
if (arr[x][y] == 0) {
for (int i = 1; i <= 6; i++) {
queue.add(new Tuple(v + i, cnt+1));
}
}
else {
queue.add(new Tuple(arr[x][y], cnt));
}
}
}
public static class Tuple implements Comparable<Tuple>{
int v;
int cnt;
public Tuple(int v, int cnt) {
this.v = v;
this.cnt = cnt;
}
@Override
public int compareTo(Tuple t) {
return this.cnt - t.cnt;
}
}
public static void print() throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(result+"");
bw.flush();
bw.close();
}
public static void init() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
arr = new int[LEN][LEN+1];
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr[a/LEN][a%LEN+1] = b;
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr[a/LEN][a%LEN+1] = b;
}
br.close();
}
}
4. 결과 및 회고
어렵지 않은 BFS 알고리즘 문제였던 것 같다. 좀 더 난이도를 높여보자!
'문제풀이 > 백준' 카테고리의 다른 글
[JAVA] BOJ 백준 17135번 - 캐슬 디펜스 (0) | 2023.10.01 |
---|---|
[JAVA] BOJ 백준 2011번 - 암호코드 (0) | 2023.09.27 |
[JAVA] BOJ 백준 15684번 - 사다리 조작 (0) | 2023.09.27 |
[JAVA] BOJ 백준 12851번 - 숨바꼭질2 (0) | 2023.09.27 |
[JAVA] BOJ 백준 1109번 - 섬 (2) | 2023.07.28 |
댓글