๋ฌธ์
๋ฌธ์ ๋งํฌ https://www.acmicpc.net/problem/16928
- ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์์ ์ฆ๊ฒจ ํ๋ ํ๋ธ๋ฌ๋ฒ๋ ์ด๋ ๋ ๊ถ๊ธํ ์ ์ด ์๊ฒผ๋ค.
- ์ฃผ์ฌ์๋ฅผ ์กฐ์ํด ๋ด๊ฐ ์ํ๋ ์๊ฐ ๋์ค๊ฒ ๋ง๋ค ์ ์๋ค๋ฉด, ์ต์ ๋ช ๋ฒ๋ง์ ๋์ฐฉ์ ์ ๋์ฐฉํ ์ ์์๊น?
- ๊ฒ์์ ์ ์ก๋ฉด์ฒด ์ฃผ์ฌ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ฃผ์ฌ์์ ๊ฐ ๋ฉด์๋ 1๋ถํฐ 6๊น์ง ์๊ฐ ํ๋์ฉ ์ ํ์๋ค.
- ๊ฒ์์ ํฌ๊ธฐ๊ฐ 10×10์ด๊ณ , ์ด 100๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ ๋ณด๋ํ์์ ์งํ๋๋ค. ๋ณด๋ํ์๋ 1๋ถํฐ 100๊น์ง ์๊ฐ ํ๋์ฉ ์์๋๋ก ์ ํ์ ธ ์๋ค.
- ํ๋ ์ด์ด๋ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๋งํผ ์ด๋ํด์ผ ํ๋ค.
- ์๋ฅผ ๋ค์ด, ํ๋ ์ด์ด๊ฐ i๋ฒ ์นธ์ ์๊ณ , ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๊ฐ 4๋ผ๋ฉด, i+4๋ฒ ์นธ์ผ๋ก ์ด๋ํด์ผ ํ๋ค.
- ๋ง์ฝ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฐ ๊ฒฐ๊ณผ๊ฐ 100๋ฒ ์นธ์ ๋์ด๊ฐ๋ค๋ฉด ์ด๋ํ ์ ์๋ค.
- ๋์ฐฉํ ์นธ์ด ์ฌ๋ค๋ฆฌ๋ฉด, ์ฌ๋ค๋ฆฌ๋ฅผ ํ๊ณ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๋ฑ์ด ์๋ ์นธ์ ๋์ฐฉํ๋ฉด, ๋ฑ์ ๋ฐ๋ผ์ ๋ด๋ ค๊ฐ๊ฒ ๋๋ค.
- ์ฆ, ์ฌ๋ค๋ฆฌ๋ฅผ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ํฌ๊ณ , ๋ฑ์ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ์์์ง๋ค.
- ๊ฒ์์ ๋ชฉํ๋ 1๋ฒ ์นธ์์ ์์ํด์ 100๋ฒ ์นธ์ ๋์ฐฉํ๋ ๊ฒ์ด๋ค.
- ๊ฒ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, 100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค์ผ ํ๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
- ์ฒซ์งธ ์ค์ ๊ฒ์ํ์ ์๋ ์ฌ๋ค๋ฆฌ์ ์ N(1 ≤ N ≤ 15)๊ณผ ๋ฑ์ ์ M(1 ≤ M ≤ 15)์ด ์ฃผ์ด์ง๋ค.
- ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ฌ๋ค๋ฆฌ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ x, y (x < y)๊ฐ ์ฃผ์ด์ง๋ค. x๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, y๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค.
- ๋ค์ M๊ฐ์ ์ค์๋ ๋ฑ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ u, v (u > v)๊ฐ ์ฃผ์ด์ง๋ค. u๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, v๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค.
- 1๋ฒ ์นธ๊ณผ 100๋ฒ ์นธ์ ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ์ ์์ ๋๋ ๋์ด ์๋๋ค. ๋ชจ๋ ์นธ์ ์ต๋ ํ๋์ ์ฌ๋ค๋ฆฌ ๋๋ ๋ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋์์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ํญ์ 100๋ฒ ์นธ์ ๋์ฐฉํ ์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
- 100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ์ต์ ๋ช ๋ฒ ๊ตด๋ ค์ผ ํ๋์ง ์ถ๋ ฅํ๋ค.
์์ด๋์ด
- ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ฒ ๊ฐ์์ BFS๋ฅผ ์จ์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
- ์ฐ์ ๊ฐ๊ฐ์ HashMap์ ์ฌ์ฉํ์ฌ ์ฌ๋ค๋ฆฌ๊ฐ ์๋ ๋ ธ๋๊ฐ๊ณผ ๋์ฐฉ์ง์ ์ key์ value๊ฐ์ผ๋ก ์ ์ฅํ๊ณ ๋ฑ์ด ์๋ ๋ ธ๋๊ฐ๊ณผ ๋์ฐฉ์ง์ ๋ ์ฌ๋ค๋ฆฌ์ฒ๋ผ ์ ์ฅ์ ํด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ BFS๋ฅผ ๋๋ฆฌ๋๋ฐ ์์์ ์ด 1์ด๋ผ๊ณ ํ์ผ๋, 1์ ๋จผ์ Queue์ ๋ฃ๊ณ while๋ฌธ์ ๋ค์ด๊ฐ๋ค.
- ์ฃผ์ฌ์๋ 1๋ถํฐ 6๊น์ง ์์ผ๋, 1๋ถํฐ 6๊น์ง for๋ฌธ์ ๋๋๋ฐ ๊ธฐ์ค ๋ ธ๋๊ฐ์์ ์ฃผ์ฌ์ ๊ฐ์ ๋ํ ๊ฐ์ด 100์ ๋์ด๊ฐ๋ฉด continue๋ฅผ ํ๊ณ , ๋์ด๊ฐ์ง ์๋๋ค๋ฉด ํด๋น ๋ ธ๋๊ฐ ์ฌ๋ค๋ฆฌ๊ฐ ์๋ ๋ ธ๋์ธ์ง ๋ฑ์ด ์๋ ๋ ธ๋์ธ์ง, ์ผ๋ฐ ๋ ธ๋์ธ์ง ํ๋จํ๋ค.
- ๋ง์ฝ ์ฌ๋ค๋ฆฌ๊ฐ ์๋ ๋ ธ๋๋ผ๋ฉด ์ฐ์ ๋ณ์ ํ๋์ ์ฌ๋ค๋ฆฌ๋ฅผ ํ๊ณ ์ฌ๋ผ๊ฐ ๊ธฐ์กด ๋ฐฐ์ด๊ฐ์ ์ ์ฅํด์ฃผ๊ณ ๊ธฐ์ค ๋ ธ๋์์ 1๋ํ ๊ฐ๊ณผ ์ฌ๋ผ๊ฐ ๋ ธ๋์ ์๋ ๋ฐฐ์ด๊ฐ ์ค ๋ ์์ ๊ฐ์ ์ด๋ํ ๋ ธ๋์ ๋ฐฐ์ด๊ฐ์ ์ ์ฅํด์ค๋ค. (๊ธฐ์ค ๋ ธ๋ == for๋ฌธ์ ๋ค์ด์ค๊ธฐ์ ์ Queue์์ ๋บ๋ ๊ฐ)
- ์์์ ๋ณ์์ ์ ์ฅํด ๋จ๋ ๊ธฐ์กด ๋ฐฐ์ด๊ฐ๊ณผ ์ต์๊ฐ์ผ๋ก ๋ค์ ์ ์ฅํ ๋ฐฐ์ด๊ฐ์ด ๊ฐ๋ค๋ฉด ์ต์๊ฐ์ด ๊ฐฑ์ ์ด ๋์ง ์์๋ค๋ ๋ป์ด๋ฏ๋ก ๋์ด๊ฐ๊ณ ๋ง์ฝ ๋ค๋ฅด๋ค๋ฉด ๋ ์ ์ ํ์๋ก ๊ฐ๋ ๋ฃจํธ๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก Queue์ ํด๋น ๋ ธ๋๊ฐ์ ๋ฃ์ด์ค๋ค.
- ๋ฑ๊ณผ ์ผ๋ฐ๋ ธ๋๋ ์ฌ๋ค๋ฆฌ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ณ์ฐํด์ ์ ์ฅํด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์๋ ๊ฐ ๋ ธ๋๋ก ๊ฐ๋ ์ต์๊ฐ์ด ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก ๋ฐฐ์ด์ 100๋ฒ์งธ๋ฅผ ์ถ๋ ฅํด์ค๋ค.
๊ฒช์ ์ํ์ฐฉ์ค
- ์ฒ์์ ์ด๋ค์์ผ๋ก ํ์ด์ผ๋๋์ง ๊ฐ์ด ์์์ ์กฐ๊ธ ๊ณ ๋ฏผ์ ํ์๋ ๊ฒ ๊ฐ๋ค (๊ทธ๋์ ์ฝ๊ฐ ํ๊ธฐ ์ซ์๋ค...ใ )
- ๋ฌธ์ ๋ฅผ ๊ณ์ ์ฝ๋ค๋ณด๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ธ๊ฒ ๊ฐ์์ BFS๋ฅผ ์จ์ผ๊ฒ ๋ค๋ผ๊ณ ์๊ฐํ๊ณ , ํ๋ค๋ณด๋ ์ฝ๊ฐ dp๋๋๋ ๋๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค...ใ ใ
- ์ฒ์์ ํ๋ฒ ํ๋ ธ๋๋ฐ ๋ฑ์ด ์๋ ๋ ธ๋๋ ๊ตณ์ด ๊ฐ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํด์ continue๋ก ๊ฑด๋๋ฐ์ด์ ํด๋น ๋ ธ๋๊ฐ์ด ๊ณ์ฐ์ด ์๋ผ์ ํ๋ ธ๋๊ฑฐ์๋ค... (๋ฑ์ ํ์ผ ์ต์๊ฐ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ์๊ฐ์ ๋ชปํ๋ค...ใ ใ )
์ฝ๋
import javax.swing.*;
import java.io.*;
import java.util.*;
public class BOJ16928 {
static int N;
static int M;
static int map[];
static HashMap<Integer, Integer> up;
static HashMap<Integer, Integer> down;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
// ๊ธธ๊ฐ๋ ํ์ ์ ์ฅํ ๋ฐฐ์ด
map = new int[101];
// ๋ฐฐ์ด์ ์ ์์ ์ ์ผ ํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํ
Arrays.fill(map, Integer.MAX_VALUE);
// ์ฌ๋ค๋ฆฌ๊ฐ ์๋ ๋
ธ๋์ ๋์ฐฉ์ง ๋
ธ๋๋ฅผ ์ ์ฅํ Hashmap
up = new HashMap<>();
// ๋ฑ์ด ์๋ ๋
ธ๋์ ๋์ฐฉ์ง ๋
ธ๋๋ฅผ ์ ์ฅํ Hashmap
down = new HashMap<>();
// ์ฌ๋ค๋ฆฌ ์์น ์ ๋ณด ์ ์ฅ
for(int i = 0; i < N; i++){
StringTokenizer st2 = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st2.nextToken());
int v = Integer.parseInt(st2.nextToken());
up.put(k, v);
}
// ๋ฑ ์์น ์ ๋ณด ์ ์ฅ
for(int i = 0; i < M; i++){
StringTokenizer st3 = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st3.nextToken());
int v = Integer.parseInt(st3.nextToken());
down.put(k, v);
}
BFS(1);
// 100๊น์ง ๊ฐ ๋, ์ต์๊ฐ์ ์ถ๋ ฅ
System.out.println(map[100]);
}
public static void BFS(int x){
Queue<Integer> q = new LinkedList<>();
// ์์์ง์ ์ Queue์ ๋ฃ์
q.offer(x);
// ์์์ง์ ์ผ ๋, ํ์๊ฐ ์์ง 0์ด๋ฏ๋ก 0์ผ๋ก ์ด๊ธฐํ
map[x] = 0;
// Queue๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต
while(!q.isEmpty()){
int xx = q.poll();
// ์ฃผ์ฌ์ 1 ~ 6์ด๊ธฐ ๋๋ฌธ์ 1๋ถํฐ 6๊น์ง ๋ฐ๋ณต
for(int i = 1; i <= 6; i++){
int nx = xx + i;
// ์ด๋ํ ์ขํ๊ฐ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ฉด continue
if(nx >= 101){
continue;
}
// ์ฌ๋ผ๊ฐ๋ ์ฌ๋ค๋ฆฌ๊ฐ ์๋ ๋
ธ๋๋ผ๋ฉด
if(up.containsKey(nx)){
// ์ฌ๋ค๋ฆฌ ํ๊ณ ๋์ฐฉํ ๋
ธ๋์ ๊ฐ
int v = up.get(nx);
// ๊ธฐ์กด ๋ฐฐ์ด ๊ฐ
int origin = map[v];
// ํด๋น ์ฌ๋ค๋ฆฌ๋ฅผ ํ๊ณ ์ฌ๋ผ๊ฐ ๋
ธ๋๊ฐ์ ๊ธฐ์กด ๊ฐ๊ณผ
// ๊ธฐ์กด ๋
ธ๋ +1 ๊ฐ์ ๋น๊ตํด์ ๋ ์์ ๊ฐ์ ์ ์ฅํ๊ณ
map[v] = Math.min(map[v], map[xx] + 1);
// ๋ง์ฝ ํด๋น ๋ฐฐ์ด๊ฐ์ด ๊ฐฑ์ ๋์๋ค๋ฉด
// ๋ ์ต์๊ฐ ๋ฃจํธ๊ฐ ์กด์ฌํ๋ค๋ ๋ป์ด๋ฏ๋ก
if(origin != map[v]){
// Queue์ ๋ฃ์ด์ค
q.offer(v);
}
}
// ๋ง์ฝ ๋ด๋ ค๊ฐ๋ ๋ฑ์ด ์๋ ๋
ธ๋๋ผ๋ฉด
else if(down.containsKey(nx)){
// ๋ฑ์ ํ๊ณ ๋์ฐฉํ ๋
ธ๋์ ๊ฐ
int v = down.get(nx);
// ๊ธฐ์กด ๋ฐฐ์ด ๊ฐ
int origin = map[v];
// ํด๋น ๋ฑ์ ํ๊ณ ๋ด๋ ค๊ฐ ๋
ธ๋๊ฐ์ ๊ธฐ์กด ๊ฐ๊ณผ
// ๊ธฐ์กด ๋
ธ๋ +1 ๊ฐ์ ๋น๊ตํด์ ๋ ์์ ๊ฐ์ ์ ์ฅํ๊ณ
map[v] = Math.min(map[v], map[xx] + 1);
// ๋ง์ฝ ํด๋น ๋ฐฐ์ด๊ฐ์ด ๊ฐฑ์ ๋์๋ค๋ฉด
// ๋ ์ต์๊ฐ ๋ฃจํธ๊ฐ ์กด์ฌํ๋ค๋ ๋ป์ด๋ฏ๋ก
if(origin != map[v]){
// Queue์ ๋ฃ์ด์ค
q.offer(v);
}
}
// ๋ง์ฝ ๋๋ค ์๋๋ผ๋ฉด ๊ทธ๋ฅ ๊ธฐ์กด ๋
ธ๋์ +1 ๊ฐ์ ์ ์ฅํ๊ณ
else{
// ๊ธฐ์กด ๋ฐฐ์ด ๊ฐ
int origin = map[nx];
// ํด๋น ๋
ธ๋์ ๊ธฐ์กด ๊ฐ๊ณผ
// ๊ธฐ์กด ๋
ธ๋ +1 ๊ฐ์ ๋น๊ตํด์ ๋ ์์ ๊ฐ์ ์ ์ฅํ๊ณ
map[nx] = Math.min(map[nx], map[xx] + 1);
// ๋ง์ฝ ํด๋น ๋ฐฐ์ด๊ฐ์ด ๊ฐฑ์ ๋์๋ค๋ฉด
// ๋ ์ต์๊ฐ ๋ฃจํธ๊ฐ ์กด์ฌํ๋ค๋ ๋ป์ด๋ฏ๋ก
if(origin != map[nx]){
// Queue์ ๋ฃ์ด์ค
q.offer(nx);
}
}
}
}
}
}
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] BOJ 2371 ํ์ผ ๊ตฌ๋ณํ๊ธฐ (2) | 2024.12.09 |
---|---|
[Java] BOJ 7662 ์ด์ค ์ฐ์ ์์ ํ (2) | 2024.09.07 |
[Java] BOJ 7576 ํ ๋งํ (0) | 2024.09.02 |
[Java] BOJ 7569 ํ ๋งํ (0) | 2024.09.01 |
[Java] BOJ 5430 AC (4) | 2024.08.31 |