관리 메뉴

Bull

[백준] 2292: 크면서 작은 수(python) 본문

카테고리 없음

[백준] 2292: 크면서 작은 수(python)

Bull_ 2024. 11. 25. 20:27

https://www.acmicpc.net/problem/2992

문제

정수 X가 주어졌을 때, X와 구성이 같으면서 X보다 큰 수 중 가장 작은 수를 출력한다.

수의 구성이 같다는 말은, 수를 이루고 있는 각 자리수가 같다는 뜻이다. 예를 들어, 123과 321은 수의 구성이 같다. 하지만, 123과 432는 구성이 같지 않다.

입력

첫째 줄에 X가 주어진다. (1 ≤ X ≤ 999999) X는 0으로 시작하지 않는다.

출력

첫째 줄에 결과를 출력한다. 만약 그러한 숫자가 없는 경우에는 0을 출력한다.

def next_greater_number(X):
    # string을 각 자리수 리스트로 변환
    digits = list(str(X))
    n = len(digits)


    i = n - 2
    # 반전 구간 찾기 (혹은  증가 부분, 오른쪽부터 읽어야함(최초))
    while i >= 0 and digits[i] >= digits[i + 1]:
        i -= 1
    # digit[i] = 5, i = 1
    # print("i",digits[i])

    if i == -1:
        return 0

    # 하강 구간에서 반전구간의 시작점보다 낮아지는 부분 (오른쪽부터 읽어야함(최초))
    j = n - 1
    while digits[j] <= digits[i]:
        j -= 1
    # digit[j] = 6, j = 2
    # print("j",digits[j])

    # 서로 위치를 바꿔줌
    # 5 <-> 6
    # 156 -> 165
    digits[i], digits[j] = digits[j], digits[i]
    # print("swap",digits)

    # [::-1] 역순 -> 16 + 5(reverse)
    digits = digits[:i + 1] + digits[i + 1:][::-1]
    # print("digits[:i + 1]",digits[:i + 1])
    # print("digits[i + 1:][::-1]",digits[i + 1:][::-1])
    # print("reverse",digits)
    return int(''.join(digits))


X = int(input())
result = next_greater_number(X)
print(result)