📖 문제 설명
*N*개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 선택 정렬로 배열 A를 오름차순정렬할 경우 *K* 번째 교환되는 수를 구해서 우리 서준이를 도와주자. 크기가 *N*인 배열에 대한 선택 정렬 의사 코드는 다음과 같다.selection_sort(A[1..N]) { # A[1..N]을 오름차순 정렬한다.
for last <- N downto 2 {
A[1..last]중 가장 큰 수 A[i]를 찾는다
if (last != i) then A[last] <-> A[i] # last와 i가 서로 다르면 A[last]와 A[i]를 교환
}
}
A의 크기 *N*(5 ≤ *N* ≤ 10,000), 교환 횟수 *K*(1 ≤ *K* ≤ N)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)*K 번째 교환되는 두 개의 수를 작은 수부터 한 줄에 출력한다. 교환 횟수가 `K* 보다 작으면 -1`을 출력한다.💡 요구사항 분석
선택 정렬 알고리즘으로 풀기 위해 선택정렬에 대해 알아봅니다.최소값을 찾는다.
import sys
n = int(sys.stdin.readline())
arr = []
for i in range(n):
arr.append(int(sys.stdin.readline()))
for i in range(n - 1):
minValue = i
for j in range(i + 1, n):
if arr[minValue] > arr[j]:
minValue = j
arr[i], arr[minValue] = arr[minValue], arr[i]
for i in arr:
print(i)
첫 번째 루프 (for i in range(n - 1))
i는 현재 정렬할 위치를 가리킵니다. 이 위치부터 시작해서 가장 작은 값을 찾아냅니다.
초기인덱스 minValue = i
현재 위치 i를 가장 작은 값의 위치로 가정합니다.
두 번째 루프 `(for j in range(i + 1, n)):`
j는 i+1부터 배열의 끝까지 순회하며, 더 작은 값을 찾기 위해 비교합니다.`if arr[minValue] > arr[j]: minValue = j:`
minValue 위치의 값이 j 위치의 값보다 크다면, minValue를 j로 업데이트합니다. 즉, 더 작은 값을 발견하면 minValue를 갱신합니다.`arr[i], arr[minValue] = arr[minValue], arr[i]:`
🧑💻코드풀이
import sys
n, k = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))
answer = []
for i in range(n - 1, 0, -1):
indexMax = i
for j in range(i - 1, -1, -1):
if arr[indexMax] < arr[j]:
indexMax = j
if arr[indexMax] != arr[i]:
k -= 1
if k <= 0:
answer.append(arr[indexMax])
answer.append(arr[i])
break
arr[indexMax], arr[i] = arr[i], arr[indexMax]
if k > 0:
print(-1)
else:
answer.sort()
print(answer[0], answer[1])