BOJ#12851 숨바꼭질 2
* 문제
* 풀이
쉬운 문제인데 푸는데 고생을 좀 했습니다.
일단은 1697 숨바꼭질 문제와 동일한데..
동생을 찾는 가장 빠른 시간을 출력하는 것과
가장 빠른 시간으로 찾는 방법의 개수까지 출력해야 합니다.
헷갈리지 말아야 할 것은 가장 빠른 시간으로 찾는 '경로'가 아니라 '방법'의 개수 입니다.
즉, 입력 데이터가 1 10일 때
가장 빠른 경로는 1 -> 2 -> 4 -> 5 -> 10 이지만
방법으로 따지면 아래와 같이 2가지가 있습니다.
1 -> 2(+1) -> 4(*2) -> 5(+1) -> 10(*2)
1 -> 2(*2) -> 4(*2) -> 5(+1) -> 10(*2)
따라서 방법의 개수를 구하려면 큐에 정점이 중복 입력 될 수 있도록 해야합니다.
즉, 각 정점을 큐에 넣을 때
발견된 상태에 따라 큐에 넣는 것이 아니라(discovered)
방문된 상태에 따라 큐에 넣어야 합니다.(visited)
-> 방문된 정점은 큐에 넣지 않는다. 발견되었으나 방문되지 않은 정점은 큐에 넣는다.
* 나의 코드
https://github.com/stack07142/BOJ/blob/master/BOJ%2312851_CatchTheCow2/src/Main.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
/**
* BOJ#12851 숨바꼭질2
* https://www.acmicpc.net/problem/12851
*/
public class Main {
static final int MIN_VALUE = 0;
static final int MAX_VALUE = 100000;
static boolean[] visited = new boolean[100001];
static int ans = 1000000000;
public static void main(String[] args) throws IOException {
int N; // 수빈이 위치 0 <= N <= 100,000
int K; // 동생의 위치 0 <= K <= 100,000
HashMap<Integer, Integer> map = new HashMap<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
bfs(N, K, map);
System.out.println(ans);
System.out.println(map.get(ans));
}
static void bfs(int N, int K, HashMap<Integer, Integer> map) {
int time = -1;
int cnt = 0;
Queue<Integer> q = new LinkedList<>();
q.add(N);
while (!q.isEmpty()) {
time++;
int size = q.size();
for (int i = 0; i < size; i++) {
int u = q.poll();
visited[u] = true;
if (u == K) {
if (ans >= time) {
ans = time;
if (map.get(ans) == null) {
map.put(ans, 1);
} else {
map.put(ans, map.get(ans) + 1);
}
}
}
if (u > MIN_VALUE && !visited[u - 1]) {
q.add(u - 1);
}
if (u < MAX_VALUE && !visited[u + 1]) {
q.add(u + 1);
}
if (u * 2 <= MAX_VALUE && !visited[u * 2]) {
q.add(u * 2);
}
}
}
}
}
'Algorithm > 그래프 탐색' 카테고리의 다른 글
BOJ#2206 벽 부수고 이동하기 (0) | 2017.04.02 |
---|---|
BOJ#3055 탈출 (0) | 2017.04.01 |
BOJ#1062 가르침 (0) | 2017.03.20 |
BOJ#1707 이분 그래프 (0) | 2017.02.21 |
BOJ#13422 도둑 (0) | 2016.11.29 |