ah-ryeong / Ahgorithm

0 stars 0 forks source link

[JavaScript] 명예의 전당 (1) #9

Open ah-ryeong opened 1 year ago

ah-ryeong commented 1 year ago

문제

"명예의 전당"이라는 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 함수를 완성해주세요.

function solution(k, score) {
  let box = [];
  var answer = [];

  for(let i = 0; i <score.length; i ++) {
    if( i < k ) {
      box.push(score[i]);
    }

    if(score[i] > Math.min(...box)) {
      box.pop();
      box.push(score[i]);
      box.sort((a,b) => b-a);
    }

    answer.push(box.at(-1));
  }

  return answer;
}

solution(4, [0, 300, 40, 300, 20, 70, 150, 50, 500, 1000]);

이번주 내내 이걸 다르게 풀어보려고 머리를 엄청 굴렸다.. 금요일까지 해보려고 했는데, 평일에 직장을 가니까 머리가 안 굴러가서 큼큼.. 아무튼 이게 테스트까지 통과하니까 눈물이 찔끔..

image
ah-ryeong commented 1 year ago
  1. 문제 이해부터 안 되는 나는 바보..
function solution(k, score) {
    let box = [];
    var answer = [];

    for(let i = 0; i < score.length; i++) {
      if(box.length < k) {
        box.push(score[i]);
        let min = Math.min(...box);
        answer.push(min);
      } else {
        let min = Math.min(...box);
        if(min < score[i]) {
          let set = new Set(box);
          set = [...set];
          if(set.length === box.length){
            box = box.filter(num => min !== num);
            box.push(score[i]);
          } else {
            box = [...set];
            box.push(score[i]); 
          }
        }
        min = Math.min(...box);
        answer.push(min);
      }
    }

    return answer;
}

solution(3, [10, 100, 20, 150, 1, 100, 200]);

이 코드는, solution(3, [10, 100, 20, 150, 1, 100, 200]); 이 경우에는 원하는 결과값이 나오는데 solution(4, [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]); 이 경우는 값이 틀려진다..

아마 내가 문제 이해를 정확히 못 한 탓이겠지..

ah-ryeong commented 1 year ago
  1. 최소값이 중복일 경우를 위해서 set을 해준건데, 최소값이 중복이 아니고 그냥 중복값이 있어도 set 을 타서 그런거였다.
function solution(k, score) {
    let box = [];
    var answer = [];

    // [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]
    for(let i = 0; i < score.length; i++) {
      if(box.length < k) {
        box.push(score[i]);
        let min = Math.min(...box);
        box.sort();
        answer.push(min);
      } else {
        let min = Math.min(...box);
        if(min < score[i]) {
          const duplicatesNum = box.filter(num => min === num);
          if(duplicatesNum.length > 1) {
            let set = new Set(box);
            set = [...set];
            if(set.length === box.length){
              box = box.filter(num => min !== num);
              box.push(score[i]);
            } else {
              box = [...set];
              box.push(score[i]); 
            }
          } else {
            box = box.filter(num => min !== num);
            box.push(score[i]);
          }
        }
        min = Math.min(...box);
        answer.push(min);
      }
    }

    return answer;
} 

solution(4, [0, 300, 40, 300, 20, 70, 150, 50, 500, 1000]);

하지만 제출하면 다시 실패..