명예의 전당

Sheryl Yun·2023년 8월 2일
0

문제 링크

처음 풀이

  • honors를 3개만 유지하는 부분을 내림차순 정렬한 뒤 맨 마지막 것을 제거하는 형태로 진행
  • scores를 돌면서 honors가 k 길이 이하일 때와 아닐 때를 구분
    • [k 길이 이하일 때]
      • honors에 score 값을 넣고, 현재 상태의 honors의 최소값을 minHonor에 넣는다.
    • [k 길이 이상일 때]
      • 이 때는 들어온 score가 minHonor보다 클 때만 진행한다. (작으면 answer에 기존 minHonor 그대로 추가)
      • score가 minHonor보다 크면 일단 honors에 score를 추가하고 (배열이 3보다 커진다)
      • honors 배열을 내림차순 정렬한 뒤 pop으로 맨 뒤(기존의 최소값)를 제거한다.
      • 이후 현재 상태의 honors에서의 최소값으로 minHonor를 업데이트한다
  • 어떠한 경우에도 answer에 해당 회차의 minHonor를 무조건 추가한다.

풀고 나서 그렇게 깔끔한 코드는 아닌 것 같아서 다른 풀이를 찾아보았다.

function solution(k, scores) {
  let answer = []; // 매일 최소 점수 배열 (길이 = score 길이)
  let honors = []; // 명예의 전당
  let minHonor = 0; // 명예의 전당 중 최소 점수 (= answer에 들어갈 값)

  for (let i = 0; i < scores.length; i++) {
    if (i < k) {
      honors.push(scores[i]);
      minHonor = Math.min(...honors);
    } else {
      if (scores[i] > minHonor) {
        honors.push(scores[i]);
        honors.sort((a, b) => b - a);
        honors.pop();
        minHonor = Math.min(...honors);
      } 
    }

    answer.push(minHonor);
  }

  return answer;
}

새로운 풀이

  • else문을 뺄 수 있었다. i < k에서는 honor에 추가하면서 기본 honor 배열을 만드는 로직이 추가될 뿐, 들어온 점수와 최소값을 비교하고 점수를 honors에 추가하고 내림차순 정렬하는 것은 모든 경우에 다 해당이 됐다.

  • minHonor 변수도 불필요했다. 점수가 최하위 점수보다 큰지를 판별할 때만 Math.min이 쓰이고 여러 군데서 쓰이지 않았기 때문이다.
    최소값을 가져오는 것은 sort 정렬을 거친 후 배열의 맨 마지막 값을 가져오는 메서드(at(-1))로 기존 값에서 연산이 가능했다.

function solution(k, scores) {
  let answer = []; // 각 차수의 최소 점수
  let honors = []; // 명예의 전당

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

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

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

  return answer;
}
profile
영어강사, 프론트엔드 개발자를 거쳐 데이터 분석가를 준비하고 있습니다 ─ 데이터분석 블로그: https://cherylog.tistory.com/

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

유익한 글이었습니다.

답글 달기