다음 순열
💡 문제 해결 아이디어
- 내가 생각한 아이디어
- 순열의 맨 뒤에서부터, 숫자가 증가하지 않는 순간을 찾는다. (for)
- 숫자가 증가하지 않는다는 것은, 그보다 앞의 숫자를 건드리지 않고도, 사전순으로 더 높은 순열을 만들 수 있다는 뜻이다.
- 그보다 앞의 숫자들은 건드리지 않는다.
- 그리고 그 때까지의 숫자들로, 사전순으로 다음에 오는 순열을 만들어 붙인다.
- 감소한 순간의 숫자를 key라고 할 때, 그 때까지의 숫자들 중 key의 바로 다음으로 큰 숫자를 찾아 key의 자리에 앉히고, 나머지 숫자들은 오름차순으로 정렬하여 key의 자리 뒤에 붙인다.
- 숫자가 증가하지 않는 순간을 찾지 못하면, -1을 출력한다. (else)
💻 작성된 코드
n = int(input())
ls = list(map(int, input().split()))
key = 0
for i in range(n-1, -1, -1):
if ls[i] < key:
tmp = ls[i:]
tmp.sort()
index = tmp.index(ls[i])
first = tmp.pop(index+1)
print(" ".join(list(map(str, ls[:i] + [first] + tmp))))
break
key = ls[i]
else :
print(-1)
이전 순열
💡 문제 해결 아이디어
- 내가 생각한 아이디어
- 다음 순열의 정반대 알고리즘
- 순열의 맨 뒤에서부터, 숫자가 감소하지 않는 순간을 찾는다. (for)
- 숫자가 감소하지 않는다는 것은, 그보다 앞의 숫자를 건드리지 않고도, 사전순으로 더 낮은 순열을 만들 수 있다는 뜻이다.
- 그보다 앞의 숫자들은 건드리지 않는다.
- 그리고 그 때까지의 숫자들로, 사전순으로 이전에 오는 순열을 만들어 붙인다.
- 증가한 순간의 숫자를 key라고 할 때, 그 때까지의 숫자들 중 key의 바로 다음으로 작은 숫자를 찾아 key의 자리에 앉히고, 나머지 숫자들은 내림차순으로 정렬하여 key의 자리 뒤에 붙인다.
- 숫자가 감소하지 않는 순간을 찾지 못하면, -1을 출력한다. (else)
💻 작성된 코드
n = int(input())
ls = list(map(int, input().split()))
key = 10001
for i in range(n-1, -1, -1):
if ls[i] > key:
tmp = ls[i:]
tmp.sort(reverse=True)
index = tmp.index(ls[i])
first = tmp.pop(index+1)
print(" ".join(list(map(str, ls[:i] + [first] + tmp))))
break
key = ls[i]
else :
print(-1)