알고리즘

백준_2529_부등호

shj718 2022. 1. 31. 11:59

재귀를 이용해서 풀었다.

재귀 함수로 정수 문자열을 만들고, 정수 문자열의 길이가 k+1 이 되면, 이 문자열이 부등호를 만족하는지 check 함수로 확인했다.

만족하면, 정답 후보에 저장했다.

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#define MAX 10
using namespace std;

int k;
vector<char> v;
bool visited[MAX];
vector<string> ans;

bool check(string num_str) { // 부등호 만족하는지 확인
	for (int i = 0; i < k; i++) {
		if (v[i] == '<') {
			if (num_str[i] > num_str[i + 1]) return false;
		}
		else if (v[i] == '>') {
			if (num_str[i] < num_str[i + 1]) return false;
		}
	}
	return true;
}

void solve(string num_str, int cnt) { // 재귀
	if (cnt == k + 1) {
		if (check(num_str)) {
			ans.push_back(num_str);
		}
		return;
	}
	for (int i = 0; i < 10; i++) {
		if (!visited[i]) {
			visited[i] = true; // 그 숫자를 사용한 적이 없다면 사용
			solve(num_str + to_string(i), cnt + 1);
			visited[i] = false;
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	char c;
	cin >> k;
	for (int i = 0; i < k; i++) {
		cin >> c;
		v.push_back(c);
	}
	solve("", 0);
	auto min_max = minmax_element(ans.begin(), ans.end());
	cout << *min_max.second << '\n';
	cout << *min_max.first << '\n';
	return 0;
}