[프로그래머스] 명예의 전당(1)

·2023년 1월 12일
0

프로그래머스

목록 보기
13/59

📌 문제 설명

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

📌 입출력 예

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

📌 코드

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int k, int[] score) {
       int [] answer = new int[score.length];
      ArrayList<Integer> arr = new ArrayList<>();
      int min = 2001, count = 0;
      for(int i=0; i< score.length; i++)
      {
          if(arr.size() == k) {
              for(int j = 0; j < arr.size(); j++)
              {
                  if(score[i] < arr.get(j))
                      count++;
              }
              if(count != arr.size()) {
                  arr.remove(arr.size() - 1);
                  arr.add(0, score[i]);
              }
          }
          else arr.add(0, score[i]);
          Collections.sort(arr, Collections.reverseOrder());
          for(int j = 0; j < arr.size(); j++)
          {
              if(arr.get(j) < min){
                  min = arr.get(j);
              }
          }
          answer[i] = min;
          min = 2001;
          count =0;
      }
       return answer;
    }
}

📌 문제 해결 과정

💡 일단 문제를 보니까 점수들이 저장되는 과정에서 자리가 많이 바뀔 것 같아서 ArrayList를 사용해서 저장하였다 점수를 k개 만큼 저장할 때 ArrayList 안에 이미 원소가 k개가 있을 때 count 변수를 이용해 저장하려는 점수가 저장된 점수들보다 작으면 저장을 하지 않고, 하나라도 저장하려는 점수보다 작은 점수가 있으면 제일 마지막 원소를 빼고 0번째 인덱스에 저장하게 하였다 제일 마지막 원소를 뺀 이유는 ArrayList 사이즈 또한 k와 똑같이 맞춰 주기 위해서였다

💡 이후 문제에서 주어진 표를 보니 점수들이 내림차순으로 저장되어 있어서 Collections의 sort() 기능을 이용해 내림차순으로 정렬해 주었다

💡 제한 사항 중 저장될 수 있는 가장 큰 점수가 2000점이었기 때문에 ArrayList에 저장된 k개의 점수 중 가장 작은 것을 고르기 위해 min 변수를 사용했고 최종적으로 minanswer[i]에 넣어서 최하위 점수를 저장해 주었다

문제 레벨이 높아질수록 테스트 케이스가 증가하나 보다... 그리고 내 코드가 효율이 떨어지는지 테스트 시간이 생각보다 많이 걸리는 기분 😂 어떻게 해야 코드를 효율적으로 짤 수 있을지 고민이다

다들 건강 잘 챙기세요❕ 코로나인 줄 알았는데 계속 음성 뜨는 걸 보니 감기 몸살이 와서 3일 동안 아무 공부도 못 했네요 최근에 너무 공부하기가 싫었는데 아프고 나니 빨리 나아서 공부하고 싶다는 생각이 들더라고요 🤔

profile
공부는 많은 양을 하진 않더라도 꾸준히 매일 하기

0개의 댓글