첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.
첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.
import sys
# 숫자 개수 입력
N = sys.stdin.readline()
# 순열 입력
A = list(map(int, sys.stdin.readline().split()))
# 다음 순열 찾기
# 단계 1 : A[i-1]<A[i]를 만족하는 가장 큰 i 찾기
max = 1
for i in range(1, len(A)):
# 오른쪽 값이 큰 것 중 가장 뒤에 있는 한 쌍 고르기
if A[i] > A[i-1] :
max = i
# print("max", max)
# 단계 2 : j>=i 이면서 A[j]>A[j-1]를 만족하는 가장 큰 j를 찾는다
bigger = max
for j in range(max+1, len(A)):
# 왼쪽 값보다 크면서 가장 오른쪽에 있는 값 찾기
if A[j] > A[max-1]:
bigger = j
# print("bigger", bigger)
# 단계3 : A[i-1]과 A[j]를 swap한다.
A[max-1], A[bigger] = A[bigger], A[max-1]
#A[i]부터 순열 뒤집기 (오름차순 정렬)
A[max:] = A[len(A):max-1:-1]
# 출력
ans = ""
for num in A:
ans += str(num)+" "
print(ans)
이건 출력 초과 오류 나서 맞지는 않음. 해설 기반으로 짜보긴 했는데 망함
다른 분의 코드를 구글링으로 가져옴
N = int(input())
input_array = list(map(int, input().split()))
for i in range(N - 1, 0, -1): # 마지막 항부터 돈다
if input_array[i - 1] < input_array[i]: # 만약 앞 열의 값이 그 뒷열의 값보다 작다면
for j in range(N - 1, 0, -1): # 다시 그 앞 열의 값을 맨 뒷열부터 비교
if input_array[i - 1] < input_array[j]: # 그 앞열의 값이 뒤에 있는 어느 열보다 작다면
input_array[i - 1], input_array[j] = input_array[j], input_array[i - 1] # 그 두 값을 스왑
input_array = input_array[:i] + sorted(input_array[i:]) # i-1 번째 까지의 리스트와 그 뒤에리스트를 정렬한 채로 붙인다.
print(*input_array) # *를 이용해 리스트 내부의 원소들을 공백을 사용하여 출력
exit() # 코드 종료
print(-1) # 만약 위에서 코드 종료가 일어나지 않았다면(마지막 항이라면) -1 출력
계속 느끼는 건데 블로그 해설이 훨씬 나은 듯.....
출처 : https://ji-gwang.tistory.com/262
쉽지 않네..
원래 내 코드에서 어떻게 오류를 고쳐야될 지 모르겠다
출력 오류가 나는데 마지막 수열일 때를 어떻게 판정해야되는지를 모르겠음
많이 부족하다..시간도 오래 걸리고
다음부터 블로그 글 위주로 보는 걸로..ㅎㅎ