์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_14395_4์—ฐ์‚ฐ

shj718 2022. 7. 2. 22:01

๐Ÿ™‹‍โ™€๏ธ ๋ฌธ์ œ

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

 

14395๋ฒˆ: 4์—ฐ์‚ฐ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ s๋ฅผ t๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ์ถœ๋ ฅํ•œ๋‹ค. s์™€ t๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” 0์„, ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ผ๋ฉด, ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์•ž์„œ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค.  ์—ฐ์‚ฐ์˜ ์•„

www.acmicpc.net

 

๐Ÿงฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ •์ : ์ •์ˆ˜

๊ฐ„์„ : ์ •์ˆ˜ → ์ •์ˆ˜

 

๐Ÿ’ก ์•„์ด๋””์–ด

์ด ๋ฌธ์ œ๋Š” BFS๋กœ ์ตœ์†Œ ํšŸ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ํ์— ์ •์ ๋งŒ ๋„ฃ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, stringํ˜•์œผ๋กœ ๊ฒฝ๋กœ๊นŒ์ง€ ๋„ฃ๋Š”๋‹ค.

์ •์  ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ set์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <tuple>
#include <cstring>
#include <set>

using namespace std;

const long long limit = 1000000000LL;

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	// input
	long long s, t;
	cin >> s >> t;
	
	// BFS
	set<long long> visited; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ฒดํฌ
	queue<pair<long long, string>> q;
	q.push(make_pair(s, ""));
	visited.insert(s);
	
	while (!q.empty()) {
		long long cur;
		string str; // ๊ฒฝ๋กœ
		tie(cur, str) = q.front();
		q.pop();

		if (cur == t) { // t๋กœ ๋ฐ”๊ฟจ์œผ๋ฉด ์ถœ๋ ฅ
			if (str.length() == 0) { // s์™€ t๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ
				str = "0";
			}
			cout << str << '\n';
			return 0;
		}
		// *, +, -, / ์ˆœ์œผ๋กœ ์—ฐ์‚ฐ
		if (0 <= cur * cur && cur * cur <= limit && visited.count(cur * cur) == 0) {
			q.push(make_pair(cur * cur, str + "*"));
			visited.insert(cur * cur);
		}
		if (0 <= cur + cur && cur + cur <= limit && visited.count(cur + cur) == 0) {
			q.push(make_pair(cur + cur, str + "+"));
			visited.insert(cur + cur);
		}
		if (0 <= cur - cur && cur - cur <= limit && visited.count(cur - cur) == 0) {
			q.push(make_pair(cur - cur, str + "-"));
			visited.insert(cur - cur);
		}
		if (cur != 0 && 0 <= cur / cur && cur / cur <= limit && visited.count(cur / cur) == 0) { // 0 ์กฐ๊ฑด ์ฒ˜๋ฆฌ
			q.push(make_pair(cur / cur, str + "/"));
			visited.insert(cur / cur);
		}
	}
	cout << -1 << '\n'; // t๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
	return 0;
}