코딩테스트

문제 - 명예의 전당 (1)

jjjkh 2024. 7. 3. 11:31

문제설명

"명예의 전당"이라는 TV 프로그램에서는 매일 1명의 가수가 노래를 부르고, 시청자들의 문자 투표수로 가수에게 점수를 부여합니다. 매일 출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당이라는 목록에 올려 기념합니다. 즉 프로그램 시작 이후 초기에 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르게 됩니다. k일 다음부터는 출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려오게 됩니다.

이 프로그램에서는 매일 "명예의 전당"의 최하위 점수를 발표합니다. 예를 들어, k = 3이고, 7일 동안 진행된 가수의 점수가 [10, 100, 20, 150, 1, 100, 200]이라면, 명예의 전당에서 발표된 점수는 아래의 그림과 같이 [10, 10, 10, 20, 20, 100, 100]입니다.

제한조건

  • 3 ≤ k ≤ 100
  • 7 ≤ score의 길이 ≤ 1,000
    • 0 ≤ score[i] ≤ 2,000

 

입출력 예

k score result
3 [10, 100, 20, 150, 1, 100, 200] [10, 10, 10, 20, 20, 100, 100]
4 [0, 300, 40, 300, 20, 70, 150, 50, 500, 1000] [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]

 

문제 접근방식

  • 명예의 전당에 오르는 점수들의 배열을 만들어준다.
  • for문을 이용하여 조건에 따라 명예의 전당 배열에 추가,삭제 해준다.
  • 위 조건에 따라 최하위 점수를 저장하는 배열을 만들어 배열에 추가해준다.

문제풀이

import Foundation

func solution(_ k:Int, _ score:[Int]) -> [Int] {
	//명예의전당 배열
    var kArray:[Int] = []
    //일차에 따른 최하위 점수 배열
    var result:[Int] = []
    
    for i in score {
		//처음에는 kArray에 비어있기때문에 if문으로 구분
        if kArray.count < k {
        	//비어있는 kArray에 추가
            kArray.append(i)
            //작은 순서로 정렬
            kArray.sort()
            //해당 일차의 최하위를 result에 추가
            result.append(kArray[0])
        }else  {
        	//명예의 전당에 추가되는 조건을 분리
            if i >= kArray[0]{
            	//최하위 점수를 제거
                kArray.remove(at: 0)
                //새로운 점수 추가
                kArray.append(i)
                //작은 순서로 정렬
                kArray.sort() 
                //해당 일차의 최하위를 result에 추가
                result.append(kArray[0])
            }else {
            	//명예의 전당의 최하위 점수가 바뀌지 않았으므로 기존 최하위 추가
                result.append(kArray[0])
            }
        }
    }
    
    return result
}

 

마무리 

처음에 문제가 길어서 어려울 것이라고 생각 했지만 천천히 문제를 해석해보니 풀이방법이 떠올라서 풀어보았다.

다른사람들의 풀이를 보니 map을 이용하기도 하고 조금 더 간결하게 코드를 작성한 방법이있었다.

앞으로는 최대한 여러가지 생각을 해 보며 문제를 풀어봐야겠다.

'코딩테스트' 카테고리의 다른 글

문제 - 카드 뭉치  (1) 2024.07.10
문제 - 연속 부분 수열 합의 개수  (0) 2024.07.08
문제 - JadenCase 문자열 만들기  (0) 2024.07.02