본문 바로가기

알고리즘/test

javascript) 프로그래머스 - 명예의 전당 (1)

 

https://school.programmers.co.kr/learn/courses/30/lessons/138477

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

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

실행코드

function removeOneElement(array, element) {
    const index = array.indexOf(element);
    if (index > -1) {
        array.splice(index, 1);
    }
    return array;
}

function solution(k, score) {
    var answer = [];
    var sample = [];
    for(let i = 0 ; score.length >i; i++){
        if (i < k){
            sample.push(score[i]);
        }else {
          if(Math.min(...sample) < score[i]){
            removeOneElement(sample,Math.min(...sample));
            sample.push(score[i]);
          }
        }
      answer.push(Math.min(...sample));
    }
    return answer;
}

풀이.

score를 k 개수만큼 담을 sample을 먼저 선언 해 주었습니다.

i가 k보다 작을때는 아무 조건없이 sample에 넣어주고 그중에서 가장 작은 값을 추출해서 answer에 push해 주었습니다.

k보다 같거나 클때는 sample에 min한 요소보다 현재의 값이 클때에는 교체를 해주어야 하기 때문에 특정원소를 제거해주는 removeOneElement함수를 만들어줘서 호출하여 제거해주고 sample에 최소값을 넣어주었습니다.

 

Math.min(...배열)

ex)

const numbers = [3, 5, 2, 7, 1];
console.log(Math.min(...numbers));

위 코드는 numbers 배열에서 가장 작은 값 1을 추출하는 것입니다.