Study hard
(c++)백준 14395번: 4연산 본문
https://www.acmicpc.net/problem/14395
14395번: 4연산
첫째 줄에 정수 s를 t로 바꾸는 방법을 출력한다. s와 t가 같은 경우에는 0을, 바꿀 수 없는 경우에는 -1을 출력한다. 가능한 방법이 여러 가지라면, 사전 순으로 앞서는 것을 출력한다. 연산의 아
www.acmicpc.net
[풀이]
bfs를 사용했다.
연산의 아스키 코드 순서대로 queue에 푸시해주었기 때문에 값이 t가 되면 바로 그때까지 했던 연산들을 출력하면 된다.
set자료구조에 나온 값을 저장하여 같은 값에 대해 더 이상 탐색하지 않게 했다.
/연산으로 인해 나오는 1은 처음 한 번만 나오면 되므로 set을 탐색하지 않고 boolean값으로 사용 여부를 체크했다.
사실 -는 쓸일이 없다. (t는 항상 1보다 큰데 -를 쓰면 0이 되기 때문에)
#include <iostream>
#include <queue>
#include <string>
#include <set>
using namespace std;
struct Cal {
long long num;//연산된 값
string cal;//연산 횟수
};
int s, t;
set<long long>Num;
void bfs() {
queue<Cal>q;
q.push({ s,"" });
int ans = -1;
Num.insert(s);
bool divided = false;
while (!q.empty()) {
long long num = q.front().num;
string cal = q.front().cal;
int cal_len = cal.length();
q.pop();
if (num == t) {
cout << cal << '\n';
return;
}
//*
long long nnum = num * num;
if (nnum <= t && Num.find(nnum) == Num.end()) {
q.push({ nnum,cal + '*' });
Num.insert(nnum);
}
//+
nnum = num + num;
if (nnum <= t && Num.find(nnum) == Num.end()) {
q.push({ nnum,cal + '+' });
Num.insert(nnum);
}
//-
nnum = num - num;
if (Num.find(nnum) == Num.end()) {
q.push({ nnum,cal + '-' });
Num.insert(nnum);
}
//'/
if (!divided && num != 0) {
nnum = num / num;
q.push({ nnum,cal + '/' });
Num.insert(nnum);
divided = true;
}
}
cout << -1 << '\n';
}
void solution() {
cin >> s >> t;
if (s == t)
cout << 0 << '\n';
else {
bfs();
}
}
int main() {
solution();
return 0;
}
'백준 > bfs, dfs' 카테고리의 다른 글
(c++)백준 16637번: 괄호 추가하기 (0) | 2020.10.11 |
---|---|
(c++)백준 16928번: 뱀과 사다리 게임 (0) | 2020.09.05 |
(c++)백준 10026번: 적록색약 (0) | 2020.09.03 |
(c++)백준 1963번: 소수 경로 (0) | 2020.09.02 |
(c++)백준 6087번: 레이저 통신 (0) | 2020.09.02 |