[Baekjoon] 2697 다음 수 구하기
https://www.acmicpc.net/problem/2697
import sys
input = sys.stdin.readline
for _ in range(int(input())):
num = list(input().strip());
if num == sorted(num, reverse = True): print("BIGGEST")
else:
for i in range(len(num)-1, 0, -1):
if num[i] > num[i-1]:
target = i-1; temp = num[target:]; break;
larger=[i for i in temp if i>num[target]]
larger.sort(); temp.remove(larger[0]);
print(*(num[:target]+larger[:1]+sorted(temp)), sep="")
point 1
가장 큰 수일 때 BIGGEST를 출력하기 위해, 문자열로 입력을 받은 후 리스트로 변환하고, 이를 reverse로 정렬한 결과가 입력과 같으면 BIGGEST를 출력하도록 한다.
point 2
입력과 구성이 같으면서 입력보다 큰 수 중 가장 작은 수를 구하려면, 입력의 가장 아랫자리수부터 숫자를 바꿔주어야 한다. 따라서, 원하는대로 정렬이 가능한 가장 아랫자리가 어디인 지를 구해야 한다.
soltion
279134399742 를 예로 들면, 99742는 이미 내림차순으로 정렬되어 있는 부분이므로, 지금보다 더 큰 숫자를 만들 수 없다. 따라서, 아랫자리부터 검사하여 오름차순이 끊기는 자리인 279134399742이 기준이 된다.
# 슬라이싱 된 리스트에서 3보다 큰 수만 뽑기
larger=[i for i in temp if i>num[target]]
# 그 중 가장 작은 수를 찾아 슬라이싱 된 리스트에서 삭제
larger.sort(); temp.remove(larger[0]);
# 변하지 않은 숫자 + 삭제한 수 + 슬라이싱 & 정렬 된 리스트
print(*(num[:target]+larger[:1]+sorted(temp)), sep="")