백준알고리즘
부등호
먼지의삶
2019. 7. 30. 01:31
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
vector<string> ans;
int n;
char a[20];
bool check[10];
bool budu(char x, char y, char op) {
if (op == '<')
if (x > y) return false;
if (op == '>')
if (x < y) return false;
return true;
}
void go(int index, string num) {
if (index == n + 1) {
ans.push_back(num);
return;
}
for (int i = 0; i <= 9; i++) {
if (check[i]) continue;
if (index == 0 || budu(num[index - 1], i + '0', a[index - 1])) {
check[i] = true;
go(index + 1, num + to_string(i));
check[i] = false;
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
go(0, "");
auto p = minmax_element(ans.begin(), ans.end());
cout << *p.second << '\n';
cout << *p.first << "\n";
return 0;
}
백트래킹 연습문제.. 백트래킹은 할때마다 아이디어를 어떻게 짜야할지가 정말난감하다
재귀 종료조건 -> index = n+1 인 상황*(n은 자릿수 조건)에서 종료하고
-> 일반재귀에서는, 종료시에 검사하지만, 백트래킹은 진행하면서 검사를하고 재귀를 이어나가서
그냥 vector ans에 자료 저장 그리고 종료
for문에서 -> i를썼는지, 안썼는지 확인하고, 썼으면 continue 로 넘어가기
안썼으면 -> index = 0일 때,(시작조건) 또는 부등호를 만족할떄.. num string에서, index - 1번째와 i의 스트링으로 -> a[index-1]의 operator를 만족하면!
check[i] 에서 i에 해당하는 값 true- > 다음 go -> 했던거 빼주기 위해 check[i] 는 다시 false로!해서하는방식이다.