문제풀이/백준oj
[백준OJ] 12851번 숨바꼭질 2
Hyeon-Uk
2021. 6. 12. 01:11
반응형
https://www.acmicpc.net/problem/12851
12851번: 숨바꼭질 2
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
-풀이-
BFS를 이용해서 문제를 풀었다. 해당지점을 한번 도착한 뒤, 다음번에 도착하는 경우는, 시간이 더 큰 경우이므로 제외시켜주기위해 visited배열을 이용하여 해당 지점 방문 여부를 체크했고, 시간을 관리하는것이 문제였다.
BFS를 돌며 동생이 위치한 지점에 도착을 했을때의 시간이 현재 갱신된 최단 시간보다 작다면, 현재까지 구한 최단시간으로 도달할 수 있는 방법의 개수는 필요가 없어지게 되므로, 최단시간을 다시 갱신해준 뒤, 방법의 수를 1로 초기화를 해준다.
도착했을때의 시간이 현재 갱신된 최단시간과 같다면, 방법의 수를 1 증가시켜주며, 최단시간과 최단시간으로 도달 방법을 구해주면 된다.
-코드-
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
bool visited[100001] = { 0 };
int t=987654321, cnt=0,n,k;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> k;
queue<pair<int, int>> q;
q.push({ n,0 });
while (!q.empty()) {
int now = q.front().first;
int time = q.front().second;
q.pop();
visited[now] = true;
if (now == k) {
if (t > time) {
t = time;
cnt = 1;
}
else if (t == time) {
cnt++;
}
}
if (now * 2 <= 100000 && !visited[now * 2]) {
q.push({ now * 2,time + 1 });
}
if (now + 1 <= 100000 && !visited[now + 1]) {
q.push({ now + 1,time + 1 });
}
if (now - 1 >= 0 && !visited[now - 1]) {
q.push({ now - 1,time + 1 });
}
}
cout << t << "\n" << cnt << "\n";
return 0;
}
반응형