[프로그래머스-Level 1] [JavaScript] 명예의 전당(1) - 배열, 정렬, splice 활용

2022. 11. 30. 12:11알고리즘/프로그래머스 알고리즘 공부

반응형

[문제]

명예의 전당이라는 TV 프로그램이 있습니다. 매일 1명의 가수가 노래를 부르고 시청자들이 문자투표로 점수를 부여합니다. 상위 k번째 이내인 경우, 그 점수를 명예의 전당 목록에 올립니다. 프로그램 시작 이후 k일까지는 모든 점수가 목록에 오르지만 k개수를 초과하는 경우 최대 k번째까지 높은 점수만 남기고 다른 점수들은 목록에서 제외됩니다. 총 발표 점수를 배열 형태로 반환하는 것이 문제입니다.

 

아래 표를 참고하시면 됩니다.

일차 1 2 3 4 5 6 7
score 10 100 20 150 1 100 200
명예의 전당 (k = 3) 10 100
10
100
20
10
150
100
20
150
100
20
150
100
100
200
150
100
발표 점수 10 10 10 20 20 100 100

 

[알고리즘]

배열, map(또는 object), splice, Math.min 사용

 

[풀이]

아래 소스 코드를 참고하시면 됩니다. 

저는 Map을 사용해서 데이터를 넣어주었습니다. 명예의 전당 스코어가 k개 초과하는 경우에는 먼저 오름차순으로 정렬한 다음, splice 함수를 사용해서 배열을 범위 지정으로 잘라줍니다. splice(0, k)는 0번째 인덱스부터 k개를 잘라낸 배열을 말합니다. 그리고 최종적으로 Math.min을 사용해서 배열에 있는 최솟값을 얻어오고 answer 배열에 추가해주면 됩니다.

function solution(k, score) {
    // 변수 선언
    const answer = [];
    const scoreMap = new Map();
    const allScores = [];
    
    // 스코어 누적해서 명예의 전당에 테이블 업데이트.
    for (let i = 0; i < score.length; i++) {
        allScores.push(score[i]);
        
        // 명예의 전당에 일차별로 누적해서 스코어 업데이트.
        scoreMap.set(i + 1, [...allScores]);
        
        // 만약 스코어가 k개 초과한 경우
        if (scoreMap.get(i + 1).length > k) {
            // 오름차순 정렬하여 k개만 추출.
            let tempArr = scoreMap.get(i + 1).sort((a, b) => b - a);
            scoreMap.set(i + 1, tempArr.splice(0, k));
        }
        
        // 최솟값을 발표점수 배열에 추가.
        answer.push(Math.min(...scoreMap.get(i + 1)));
    }
    return answer;
}

 

반응형