정수 $X$가 주어졌을 때, $X$와 구성이 같으면서 $X$보다 큰 수 중 가장 작은 수를 출력하는 문제이다. $X$는 최대 6자리 수이므로 나올 수 있는 수는 최대 $6!$개이다. 모두 탐색을 해도 충분한 시간이다.
맨 처음 수를 저장해놓고, 숫자를 정렬한다. 그 후에는 그 다음으로 나올 수열을 찾아보며 해당 수열이 맨 처음 수보다 큰지 확인을 해가면서 탐색을 진행하면 된다. 만약, 끝까지 큰 값이 없었다면(내림차순 정렬값이 맨 처음 수였다면) 0을 출력한다.
string s;
int n;
bool vst[7];
void solve(string str) {
if (str.length() == s.length()) {
if (stoi(str) > n) {
cout << str << '\n';
exit(0);
}
return;
}
for (int i = 0; i < s.length(); i++) {
if (!vst[i]) {
vst[i] = true;
solve(str + s[i]);
vst[i] = false;
}
}
}
int main(void) {
fastio;
cin >> s;
n = stoi(s);
sort(all(s));
solve("");
cout << 0;
return 0;
}
`next_permutation`을 이용하면 간단해진다.
int main(void) {
fastio;
string s; cin >> s;
if (next_permutation(all(s))) cout << s;
else cout << 0;
return 0;
}
'알고리즘' 카테고리의 다른 글
[BOJ 9660] 돌 게임 6 (0) | 2024.04.01 |
---|---|
[BOJ 2056] 작업 (0) | 2024.03.29 |
[BOJ 1448] 삼각형 만들기 (0) | 2024.03.28 |
[BOJ 3673] 나눌 수 있는 부분 수열 (0) | 2024.03.28 |
[BOJ 20310] 타노스 (0) | 2024.03.26 |