본문 바로가기
에러 잡기/문제 풀이

백준 12851 숨바꼭질 2

by HJINHA 2021. 4. 3.

www.acmicpc.net/problem/12851

 

12851번: 숨바꼭질 2

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

 

 숨바꼭질1과는 다르게 '가장 빠른 시간으로 찾는 방법이 몇 가지인지'도 출력해야 하기 때문에, 큐에 넣을 때 visited 체크를 하지 않고 pop할 때 방문처리한다. 수빈이와 동생의 처음 위치가 같을 경우 0 1 을 출력하고 끝낸다.

 이동 시간이 이미 최소 이동 시간보다 큰 경우는 큐에 넣지 않았다.

#include<iostream>
#include<queue>
using namespace std;

bool visited[200000];

int main() {
	int n, k, min{ 100000 }, count{ 0 };
	cin >> n >> k;
	if (n == k) {
		cout << 0 << "\n" << 1;
		return 0;
	}
	else if (n > k) {
		cout << n - k << "\n" << 1;
		return 0;
	}

	queue<pair<int, int>> q;
	q.push({ n, 0 });

	while (!q.empty()) {
		int cur = q.front().first;
		int times = q.front().second;
		q.pop();
		visited[cur] = true;
		if (cur + 1 == k || cur - 1 == k || cur * 2 == k) {
			if (times == min)  //최소 시간인 경우
				count++;
			else if (times < min) {  //최소 시간 갱신
				count = 1;
				min = times;
			}
			continue;
		}
		if (cur < k && visited[cur + 1] == false) {
			if (times < min)
				q.push({ cur + 1,times + 1 });
		}
		if (cur > 0 && visited[cur - 1] == false) {
			if (times < min)
				q.push({ cur - 1, times + 1 });
		}
		if (cur < k && visited[cur * 2] == false) {
			if (times < min)
				q.push({ cur * 2, times + 1 });
		}
	}
	cout << min + 1 << "\n" << count;
}

'에러 잡기 > 문제 풀이' 카테고리의 다른 글

백준 2193 이친수  (0) 2021.04.15
백준 13913 숨바꼭질4  (0) 2021.04.09
백준 16953 A->B  (0) 2021.03.30
백준 7562 나이트의 이동  (0) 2021.03.26
백준 1012 유기농 배추  (0) 2021.03.24

댓글