[ ๋ฐฑ์ค / BOJ 16928 ] ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์ ( ์๋ฐ / JAVA )
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๋ถํฐ 6๊น์ง ์๊ฐ ํ๋์ฉ ์ ํ์๋ค. ๊ฒ์์ ํฌ๊ธฐ๊ฐ 10×10์ด๊ณ , ์ด 100๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ ๋ณด๋ํ์์ ์งํ๋๋ค. ๋ณด๋ํ์๋ 1๋ถํฐ 100๊น์ง ์๊ฐ ํ๋์ฉ ์์๋๋ก ์ ํ์ ธ ์๋ค.
ํ๋ ์ด์ด๋ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๋งํผ ์ด๋ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, ํ๋ ์ด์ด๊ฐ i๋ฒ ์นธ์ ์๊ณ , ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๊ฐ 4๋ผ๋ฉด, i+4๋ฒ ์นธ์ผ๋ก ์ด๋ํด์ผ ํ๋ค. ๋ง์ฝ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฐ ๊ฒฐ๊ณผ๊ฐ 100๋ฒ ์นธ์ ๋์ด๊ฐ๋ค๋ฉด ์ด๋ํ ์ ์๋ค. ๋์ฐฉํ ์นธ์ด ์ฌ๋ค๋ฆฌ๋ฉด, ์ฌ๋ค๋ฆฌ๋ฅผ ํ๊ณ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๋ฑ์ด ์๋ ์นธ์ ๋์ฐฉํ๋ฉด, ๋ฑ์ ๋ฐ๋ผ์ ๋ด๋ ค๊ฐ๊ฒ ๋๋ค. ์ฆ, ์ฌ๋ค๋ฆฌ๋ฅผ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ํฌ๊ณ , ๋ฑ์ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ์์์ง๋ค.
๊ฒ์์ ๋ชฉํ๋ 1๋ฒ ์นธ์์ ์์ํด์ 100๋ฒ ์นธ์ ๋์ฐฉํ๋ ๊ฒ์ด๋ค.
๊ฒ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, 100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค์ผ ํ๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒ์ํ์ ์๋ ์ฌ๋ค๋ฆฌ์ ์ N(\(1 \leq N \leq 15\))๊ณผ ๋ฑ์ ์ M(\(1 \leq M \leq 15\))์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ฌ๋ค๋ฆฌ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ x, y (x < y)๊ฐ ์ฃผ์ด์ง๋ค. x๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, y๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค.
๋ค์ M๊ฐ์ ์ค์๋ ๋ฑ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ u, v (u > v)๊ฐ ์ฃผ์ด์ง๋ค. u๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, v๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค.
1๋ฒ ์นธ๊ณผ 100๋ฒ ์นธ์ ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ์ ์์ ๋๋ ๋์ด ์๋๋ค. ๋ชจ๋ ์นธ์ ์ต๋ ํ๋์ ์ฌ๋ค๋ฆฌ ๋๋ ๋ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋์์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ํญ์ 100๋ฒ ์นธ์ ๋์ฐฉํ ์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ์ต์ ๋ช ๋ฒ ๊ตด๋ ค์ผ ํ๋์ง ์ถ๋ ฅํ๋ค.
ํ์ด
BFS ๋ฅผ ์ด์ฉํด์ ํด๊ฒฐ โผ๏ธ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main_BOJ_16928_๋ฑ๊ณผ์ฌ๋ค๋ฆฌ๊ฒ์ {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
int N = Integer.parseInt(stringTokenizer.nextToken());
int M = Integer.parseInt(stringTokenizer.nextToken());
int[] snakeAndladder = new int[101];
boolean[] isVisited = new boolean[101];
int[] count = new int[101];
for(int i = 0 ; i < N+M ; i++){
stringTokenizer = new StringTokenizer(br.readLine());
int u = Integer.parseInt(stringTokenizer.nextToken());
int v = Integer.parseInt(stringTokenizer.nextToken());
snakeAndladder[u] = v;
}
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
count[1] = 0;
isVisited[1] = true;
while(!queue.isEmpty()){
int now = queue.poll();
if(now == 100){
System.out.println(count[now]);
break;
}
for(int i = 1; i <= 6; i++){
int next = now + i;
if(100 < next || isVisited[next]) continue;
if(snakeAndladder[next] != 0){
if(!isVisited[snakeAndladder[next]]){
isVisited[snakeAndladder[next]] = true;
count[snakeAndladder[next]] = count[now] + 1;
queue.offer(snakeAndladder[next]);
}
}
else{
isVisited[next] = true;
count[next] = count[now] + 1;
queue.offer(next);
}
}
}
}
}