PS (C, C++)

[백준/C++] 14395 4연산

최연재 2024. 11. 25. 19:15

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

코드

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

#define MAX 1000000001
#define FASTIO ios::sync_with_stdio(false); cin.tie(NULL);
typedef long long ll;
typedef pair<ll, string> p;
set<ll> visit;

int s, t;
void bfs() {
	queue<p> q;

	q.push({ s, "" });
	visit.insert(s);

	if (s == t) {
		cout << 0;
		return;
	}

	while (!q.empty()) {
		ll now = q.front().first;
		string st = q.front().second;
		q.pop();

		if (now == t) {
			cout << st;
			return;
		}

		if (now * now < MAX && visit.find(now * now) == visit.end()) {
			visit.insert(now * now);
			q.push({ now * now, st + "*" });
		}

		if (now + now < MAX && visit.find(now + now) == visit.end()) {
			visit.insert(now + now);
			q.push({ now + now, st + "+" });
		}

		if (visit.find(now - now) == visit.end()) {
			visit.insert(now - now);
			q.push({ now - now, st + "-" });
		}

		if (now != 0 && visit.find(now / now) == visit.end()) {
			visit.insert(now / now);
			q.push({ now / now, st + "/" });
		}
	}
	cout << -1;
	return;
}

int main() {
	FASTIO;
	cin >> s >> t;
	bfs();
	return 0;
}

 

설명

*, +, - , / 순으로 bfs를 돌리면서 now가 t가 되는지 확인하면 된다. 

느낀 점

아이디어 자체는 바로 생각했는데, 구현하면서 메모리 초과와 틀렸습니다를 만났다. 처음에 bool 배열로 방문 관리를 했는데 메모리 초과가 발생했다. 그래서 set으로 변경해서 코드를 작성했다. 이 코드는 틀렸는데 코드를 살펴보니 방문 확인 순서에서 틀린 부분이 있어서였다. 반례 게시판의 반례 덕분에 이 문제를 찾았다..

 

고쳐서 제출하니 맞았다!

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

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