알고리즘

[BOJ 2992] 크면서 작은 수

dldyou 2024. 3. 29. 13:00

정수 $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