문제설명
"명예의 전당"이라는 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 |