[Baekjoon] 10972번 다음 순열

Updated:

문제

1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 다음에 오는 순열을 구하는 프로그램을 작성하시오.

사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.

N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.

  • 1, 2, 3
  • 1, 3, 2
  • 2, 1, 3
  • 2, 3, 1
  • 3, 1, 2
  • 3, 2, 1

입력

첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.

출력

첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.

예제

Example 1:

Input: 
4
1 2 3 4 
Output: 
1 2 4 3

Example 2:

Input:
5
5 4 3 2 1
Output:
-1

조건

시간 제한 : 1초

메모리 제한 : 256 MB

풀이과정

풀이 1

뒤에서 부터 붙어있는 수 2개를 비교하다가 뒤의 수가 앞의 수보다 커지는 경우에 멈춘다. 그리고 해당 수보다 큰 수중에서 제일 작은 수를 그 뒤에서 찾아서 바꿔주고, 그 뒤의 수는 역으로 정렬해준다.

n = int(input())

arr = list(map(int, input().split()))

ans = -1
res = []
for i in range(n-2,-1,-1):
    if arr[i+1] > arr[i]:
        sub = 0
        for j in range(i+1,n):
            if arr[i] < arr[j]:
                sub = j
        arr[i], arr[sub] = arr[sub], arr[i]
        res += arr[:i+1]
        res += arr[i+1:][::-1]


        print(" ".join(map(str, res)))
        break

else:
    print(-1)

Leave a comment