본문 바로가기
Coding Test/1일 1문제

[1일1문제] 백준 23884번: 알고리즘 수업 - 선택 정렬 4

by na1-4an 2023. 9. 5.
 

문제

오늘도 서준이는 선택 정렬 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.

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퍼..)

그래서 그냥 구글링해서 풀었다..

 

[백준] 23884번 알고리즘 수업 - 선택 정렬4 ★★★

💡소요시간 : 10m

velog.io