PS (C, C++)

[백준/C++] 16397 탈출

최연재 2024. 12. 1. 02:59

https://www.acmicpc.net/problem/16397

코드

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

#define FASTIO ios::sync_with_stdio(false); cin.tie(NULL);
#define MAX 99999
int n, t, g, tmp;
bool visit[MAX];
string s;
queue<pair<int, int>> q;

void bfs() {
	while (!q.empty()) {
		int now = q.front().first;
		int cnt = q.front().second;
		q.pop();
		if (cnt > t) continue;

		if (now == g) {
			cout << cnt;
			return;
		}
		
		if (now + 1 <= MAX && !visit[now+1]) {
			q.push({ now + 1, cnt+1 });
			visit[now + 1] = true;
		}

		if (now * 2 <= MAX && now != 0) {
			s = to_string(now*2);
			s[0] -= 1;
			tmp = stoi(s);
			if (!visit[tmp]) {
				q.push({ tmp , cnt+1});
				visit[tmp] = true;
			}
		}
	}
	cout << "ANG";
}

int main() {
	FASTIO;
	cin >> n >> t >> g;
	q.push({ n, 0 });
	visit[n] = true;
	bfs();
	return 0;
}

설명

A를 누르면 N + 1이 되고 B를 누르면 N*2에서 0이 아닌 가장 높은 자릿수가 1이 줄어드는 것을 구현합니다. 큐에는 현재값과 버튼을 누른 횟수를 저장하고 BFS를 돌려줍니다. 

느낀 점

버튼의 동작 방식을 그대로 구현하고, 큐에는 {현재 값,  버튼 누른 횟수}를 기록해주면서 문제를 풀면 됩니다!

'PS (C, C++)' 카테고리의 다른 글

[백준/C++] 28353 고양이 카페  (2) 2024.11.30
[백준/C++] 14395 4연산  (0) 2024.11.25
[백준/C++] 17609 회문  (0) 2024.11.21
[백준/C++] 22352 항체 인식  (0) 2024.11.20
[백준/C++] 9205 맥주 마시면서 걸어가기  (1) 2024.11.18