-
반응형
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; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 17140번 이차원 배열과 연산 (0) 2021.06.28 [백준OJ] 11034번 캥거루 세마리2 (0) 2021.06.20 [백준OJ] 16162번 가희와 3단 고음 (0) 2021.06.12 [백준OJ] 17070번 파이프 옮기기 (0) 2021.06.10 [백준OJ] 9465번 스티커 (0) 2021.06.09 댓글