[프로그래머스] javascript | Level1 명예의전당

알고리즘
블로그 이미지

이챙(leechaeng)

﹒2023. 9. 25.

문제

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

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

명예의 전당 목록의 점수의 개수 k, 1일부터 마지막 날까지 출연한 가수들의 점수인 score가 주어졌을 때, 매일 발표된 명예의 전당의 최하위 점수를 return하는 solution 함수를 완성해주세요.

 

제한사항

  • 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]

 

풀이

문제를 보고서 k번째 일때를 분기로 나눠주고 차례로 값을 push 한다음 가장 작은 값을 result배열에 넣어주면 되겠다 생각했다.

function solution(k, score) {
    let hall = [];
    const result = [];
    
    for(let i = 0; i < score.length; i++){
        if(hall.length < k){
            hall.push(score[i]);
        }else{
            if(hall[k-1] < score[i]){
                hall[k-1] = score[i]
            }
        }
        result.push(Math.min(...hall))        
        hall.sort((a,b) => b - a);
    }
    
    return result
}

- hall 배열이 명예의 전당 배열이다.
- k보다 hall배열 길이가 작을때까지 차례대로 푸쉬한다
- k보다 hall배열 길이가 클때는 hall 배열의 k번째보다 score값이 크면 hall배열의 3번째를 score값으로 바꿔준다. 문제에 써있듯이 K번째의 순위 점수보다 높으면 해당 점수가 명예의 전당에 오른다고 나와있어서 그대로 코드에 반영했다.
- hall배열 중 가장 작은값을 result배열에 넣어준다 
- hall 배열을 오름차순으로 정렬해준다.

문제를 그대로 코드에 반영하다보니 금방 문제가 풀린듯 하다. if문이 굳이 중첩안해도 될듯했는데 다른사람 풀이 보니까 하나의 if문으로 풀 수 있었다.

다른사람풀이

function solution(k, score) {
    let answer = [];
    let temp = [];
    for(let i = 0; i < score.length; i++){
        temp.push(scorep[i])
        temp.sort((a,b) => b - a);

        if(temp.length < k){
            answer.push(temp[temp.length - 1])
        }else{
            answer.push(temp[k-1])
        }
    }
}

k 보다 temp 배열의 길이가 작으면 temp의 마지막 값을 answer배열에 넣고
k 보다 temp 배열의 길이가 크면 temp의 k번째를 바로 푸쉬하면 된다. 

이챙(leechaeng)
이챙(leechaeng)

프론트엔드 개발도 하고 뛰기도 하고

'알고리즘' 카테고리의 관련 글