[C++]백준13549번 숨바꼭질3

1 minute read

오늘은 백준13549번 숨바꼭질3 문제를 풀어보도록 하자.

처음엔 그냥 큐를 써서 BFS를 돌렸지만 TLE가 나왔다. 그래서 deque로 짜게 되었는데 우선 가장 짧은 시간 으로 가야하기 때문에

우선 고려해주어야 할 것은 *2이다. 따라서 우선순위 큐로 풀거나 *2를 먼저 계산해주는 deque 컨테이너를 써서 접근해야한다.

문제는 다음과 같다.

                               [접근법]

  1. *2 일 땐 시간이 걸리지 않으므로 우선적으로 처리하기 위해 push_front를 해주고 나머지 +1과 -1은 후에 처리해주기 때문에
  push_back을 해준다.
  
  2. 그 후 도착 값과 같으면 answer = cnt를 해주고 bfs함수를 종료한다.
                                     [코드]
#include <iostream>
#include <deque>
using namespace std;
bool visit[200001];
struct pos {
	int x;
	int cnt;
};
deque<pos>dQ;
int N, K, answer = 987654321;

void bfs() {
	while (!dQ.empty()) {
		int size_of_dQ = dQ.size();

		for (int i = 0; i < size_of_dQ; i++) {
			int x = dQ.front().x;
			int cnt = dQ.front().cnt;

			dQ.pop_front();
			if (x == K) {
				if (answer > cnt) {
					answer = cnt;
					return;
				}
			}
			if (x == 0) {
				if (!visit[x + 1]) {
					visit[x + 1] = true;
					dQ.push_back({ x + 1, cnt + 1 });
				}
			}
			else {
				if (x * 2 <= 200000) {
					if (!visit[x * 2]) {
						visit[x * 2] = true;
						dQ.push_front({ x * 2, cnt });
					}
				}
				if (x + 1 <= 200000) {
					if (!visit[x + 1]) {
						visit[x + 1] = true;
						dQ.push_back({ x + 1, cnt + 1 });
					}
				}
				if (!visit[x - 1]) {
					visit[x - 1] = true;
					dQ.push_back({ x - 1, cnt + 1 });
				}
			}
		}
	}
}

int main() {
	cin >> N >> K;
	dQ.push_front({ N,0 });
	visit[N] = true;
	bfs();
	cout << answer;
}