문제
오늘도 서준이는 선택 정렬 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.
N개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 선택 정렬로 배열 A를 오름차순 정렬할 경우 K 번 교환이 발생한 직후의 배열 A를 출력해 보자.
N이 매우 커서 시간 초과를 고민하고 있는 우리 서준이를 도와주자.
크기가 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 ≤ 500,000), 교환 횟수 K(1 ≤ K ≤ N)가 주어진다.
다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)
출력
K 번 교환이 발생한 직후의 배열 A를 한 줄에 출력한다. 교환 횟수가 K 보다 작으면 -1을 출력한다.
풀이
아래와 같이 풀었지만 시간초과가 떴다.. 이중 반복문을 없애 봐야겠댜,,
def select(array, K, N):
sorted_array = sorted(array)
cnt = 0
repeat = 0
max_index = 0
while cnt < N:
for i in range(K - repeat):
if array[max_index] < array[i]:
max_index = i
if array[max_index] != array[K - repeat -1]:
array[max_index], array[K-repeat-1] = array[K-repeat-1], array[max_index]
cnt += 1
if array == sorted_array and i != N-1:
return("-1")
repeat += 1
max_index = 0
return(array)
K, N = map(int, input().split())
array = list(map(int, input().split()))
result = select(array, K, N)
if result == "-1":
print(result)
else:
print(*result, sep='')
아래 처럼 이중 반복문을 없애봤다..
def select(array, K, N):
sorted_array = sorted(array)
cnt = 0
repeat = 0
while cnt < N:
array2 = array[0: K - repeat]
max_index = array2.index(max(array2))
if array[max_index] != array[K - repeat -1]:
array[max_index], array[K-repeat-1] = array[K-repeat-1], array[max_index]
cnt += 1
if array == sorted_array and cnt!= N:
return("-1")
repeat += 1
max_index = 0
return(array)
K, N = map(int, input().split())
array = list(map(int, input().split()))
result = select(array, K, N)
if result == "-1":
print(result)
else:
print(*result, sep=' ')
근데도 시간 초과가 나서 답답했다!!
이게 어떻게 정답률 69퍼인지 모르겠어서 찾아보니까 바로 전 문제를 풀면 쉽게 풀 수 있는 문제였어서 그랬던 것이다.
(참고로 전 문제는 정답률 33퍼..)
그래서 그냥 구글링해서 풀었다..
'Coding Test > 1일 1문제' 카테고리의 다른 글
[1일1문제] 백준 14502번: 연구소 (4) | 2023.09.07 |
---|---|
[1일1문제] 백준 2805번: 나무 자르기 (0) | 2023.09.06 |
[1일1문제] 백준 24445번: 알고리즘 수업 - 너비 우선 탐색 2 (0) | 2023.09.04 |
[1일1문제] 백준 2210번: 숫자판 점프 (0) | 2023.09.03 |
[1일1문제] 백준 10773번: 제로 (0) | 2023.09.02 |