문제
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을 출력한다.
예제 입력 1
4
1 2 3 4
예제 출력 1
1 2 4 3
예제 입력 2
5
5 4 3 2 1
예제 출력 2
-1
풀이
import sys
input = sys.stdin.readline
n = int(input())
s = list(map(int, input().split()))
x = 0
for i in range(n - 1, 0, -1):
if s[i - 1] < s[i]:
x = i - 1
break
for i in range(n - 1, 0, -1):
if s[x] < s[i]:
s[x], s[i] = s[i], s[x]
s = s[:x + 1] + sorted(s[x + 1:])
print(*s)
exit()
print(-1)
C++의 next_permutation함수를 구현한 것이다.
순열의 마지막이라는 뜻은 모든 원소가 오름차순으로 정렬되어 있다는 말
따라서 두번째 for문안의 if문으로 들어가지 않는다.
그외에는 맨 뒤부터 두개씩 검사한다.
[1,5,3,2] 가 있다면 (3, 2) , (5, 3) , (1, 5) 의 순으로 검사를하는데 뒤의 수가 더 큰것이 있다면 x에 그 앞 값을 저장하고 break를 통해 빠져나온다.
두번째 for문을 통해 x에 저장한 값과 맨 뒤부터 검사하여 더 큰값이 있다면 두 값을 SWAP해준다. ==> [2,5,3,1]
그 다음 x위치 뒤의 값을 정렬하여 붙혀준다 ==> [2,1,3,5]
반응형
'Algorithm > Online judge' 카테고리의 다른 글
[백준] 13241번 > 최소공배수 (0) | 2021.03.04 |
---|---|
[백준] 11441번 > 합 구하기 (0) | 2021.03.04 |
[백준] 2512번 > 예산 (0) | 2021.03.03 |
[백준] 1051번 > 숫자 정사각형 (0) | 2021.03.03 |
[백준] 11725번 > 트리의 부모 찾기 (0) | 2021.03.02 |