포스트

207. 명예의 전당 (1)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import Foundation

func solution(_ k:Int, _ score:[Int]) -> [Int] {
    
    var result : [Int] = [] // 발표 점수
    var halloffame : [Int] = [] // 명예의 전당
    
    for i in score.indices {
        if i < k { // k일차 까지
            halloffame.append(score[i]) // 먼저 해당 값을 명예의 전당으로 넣는다.
            halloffame.sort(by:<) // 그후 오름차순 정렬을 하고
            result.append(halloffame[0]) // 그 첫번째 값을 가져온다.
        } else {
            if score[i] > halloffame[0] { // score가 명예의 전당 보다 크면
                halloffame.append(score[i]) // 명예의 전당에 해당 score등록
                halloffame.sort(by:<) // 오름차순
                halloffame.removeFirst() // 첫번째 값 제거
                result.append(halloffame[0]) // 그다음 첫번째 값 추가
                
            } else {
                result.append(halloffame[0]) // 첫번째 값 추가
            }
        }
        
    }

    return result
}

팀원들간 코딩테스트 문제를 풀고 발표를 하면서 일단은 풀어야겠다는 생각이 들어 이해한대로 풀었다.

테스트는 되어서 끝났다 싶었다. 하지만 제출을 해보니 대부분 틀려서 이게 뭔가 싶었는데

처음에 k일차까지의 로직의 순서를 내가 잘못 적어서 대부분 틀리게 나왔었다.

1
2
3
4
5
6
// before
if i < k { 
    result.append(score[0])
    halloffame.append(score[i])
    halloffame.sort(by:<)
}

그래서 반례를 찾아보았다.

입력값 〉 3, [100, 30, 40, 150, 300, 200, 200] 기댓값 〉 [100, 30, 30, 40, 100, 150, 200] 일때 였고, 기댓값을 보자마자 내가 무슨 실수를 저질렀는지 알아차렸다.

그래서 위와 같이 고쳐주었고 결과 값을 리턴하였다.

코드를 이쁘게 하는건 그 다음 생각이고 일단은 푸는것에 목표를 두자.

보류했던 문제도 결국 고차함수를 써보려고하다가 이상해서 넘긴것들이 많은데, 주말이나 한번 시간내서 진득하게 풀어봐야겠다.

sort로 직관적으로 하던걸 조금 수정하였다.

최소값으로 접근하여 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import Foundation

func solution(_ k:Int, _ score:[Int]) -> [Int] {
    
    var result : [Int] = []
    var halloffame : [Int] = []
    
    for i in score.indices {
        if i < k { // 초기 k일까지.
            halloffame.append(score[i]) // 명예의 전당에 해당일차의 score값을 추가.
            result.append(halloffame.min()!) // 발표점수에 최하위 점수를 추가.
        } else { // k일 이후
            if score[i] >= halloffame.min()! { // score값이 명전 최소값과 크거나 같다면?
                halloffame.append(score[i]) // 명예의 전당에 해당 score값을 추가
                halloffame.remove(at:halloffame.firstIndex(of:halloffame.min()!)!) // 최소값에 해당하는 위치의 값을 명예의 전당에서 삭제
                result.append(halloffame.min()!) // 발표점수에 최하위 점수를 추가
                
            } else { // score값이 작다면?
                result.append(halloffame.min()!) // 발표점수에 최하위 점수를 추가
            }
        }
        
    }

    return result
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.