출처 : https://www.acmicpc.net/problem/1083
n = int(input())
nums = list(map(int, input().split()))
s = int(input())
# 배열 완료된 숫자 개수
done = 0
# 이상적 배열
ideal = sorted(nums, reverse=True)
while s > 0 :
if nums == ideal :
break
range_max = max(nums[done : min(n, done+s+1)])
# print("배열 완료된 숫자 개수", done)
# print("현 범위", nums[done : min(n, done+s+1)])
# print("현 범위 최대", range_max)
idx = nums[done:].index(range_max) + done
# print("현 범위 최대의 인덱스 ", idx)
if idx != done :
nums.remove(range_max)
nums.insert(done, range_max)
s = s - (idx - done)
done += 1
# print("현 배열", nums)
# print("남은 교환 수", s)
print(*nums, end=" ")
매 단계마다 검색 범위 내에서 가장 큰 숫자를 맨 앞으로 옮겨온다.
검색 범위는 맨 앞의 숫자부터 총 s+1 개의 숫자까지이다.
숫자 리스트 nums = [1, 3, 4, 2, 5], s = 3 인 테스트 케이스를 생각해보자.
[1, 3, 4, 2] 범위 내에서 가장 큰 수는 4이고, 따라서 4를 맨 앞으로 옮겨온다.
그럼 nums = [4, 1, 3, 2, 5]가 되고, 4를 옮겨오는데 4의 인덱스만큼의 교환(=2)을 했으므로 s = 1 이 된다.
다음 검색 범위는 이미 배치 완료된 수는 제외하므로 done이라는 변수에 그 개수를 저장한 후 인덱스들에 done만큼 더해준다.
즉 4를 넘어서 [1, 3] 범위에서 탐색해 3을 1 앞으로 옮겨오면 최종적인 배열은
[4, 3, 1, 2, 5]
'알고리즘 문제 풀이' 카테고리의 다른 글
백준 1463번 : 1로 만들기 (Python) (0) | 2022.12.15 |
---|---|
백준 2468번 : 안전영역 (Python) (0) | 2022.12.12 |
백준 1181번 : 단어 정렬 (Python) (0) | 2022.12.05 |
백준 11729번 : 하노이의 탑 이동 순서 (Python) (0) | 2022.12.04 |
에라토스테네스의 체 (Python) (0) | 2022.11.22 |
댓글