[BOJ] 10972 다음 순열

Simulation


이 문제는 순열과 조합 문제같지만,,, 전혀 성격이 다른 문제다.

그냥 규칙을 파악해서 구현피지컬이 필요한 문제다.

물론 높은 난이도는 아니나 까다롭게 실수할 가능성이 높은 문제다.

알고리즘은, 뒤 부터 앞으로 순회하며 더 큰 숫자가 나오면 킵하고 다시 뒤로 돌아가며 해당 수보다 큰 숫자중 가장 작은 숫자와 위치를 바꾸고 뒤에 있는 배열을 정렬하여 출력하면 된다.

구현


import sys

def solution(n):
    idx = 0
    flag = False
    for i in range(n-1, 0, -1):
        if seq[i] > seq[i-1]:
            idx = i-1
            flag = True
            break
    if not flag:
        return -1
    idx2 = 0
    tmp = 10001
    for i in range(idx, n):
        if seq[idx] < seq[i] < tmp:
            tmp = seq[i]
            idx2 = i
    seq[idx], seq[idx2] = seq[idx2], seq[idx]
    answer = " ".join(map(str, seq[:idx+1]))
    answer += " "
    answer += " ".join(map(str, sorted(seq[idx+1:])))
    return answer.strip()

if __name__ == "__main__":
    N = int(sys.stdin.readline().rstrip())
    seq = list(map(int, sys.stdin.readline().rstrip().split()))
    print(solution(N))

태그:

카테고리:

업데이트: