문제
"명예의 전당"이라는 TV 프로그램에서는 매일 1명의 가수가 노래를 부르고, 시청자들의 문자 투표수로 가수에게 점수를 부여합니다. 매일 출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당이라는 목록에 올려 기념합니다. 즉 프로그램 시작 이후 초기에 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르게 됩니다. k일 다음부터는 출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려오게 됩니다.
이 프로그램에서는 매일 "명예의 전당"의 최하위 점수를 발표합니다. 예를 들어, k = 3이고, 7일동안 진행된 가수의 점수가 [10, 100, 20, 150, 1, 100, 200]이라면, 명예의 전당에서 발표된 점수는 아래의 그림과 같이 [10, 10, 10, 20, 20, 100, 100] 입니다.
일차 | 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 |
명예의 전당 목록의 점수의 개수 k, 1일부터 마지막 날까지 출연한 가수들의 점수인 score가 주어졌을 때, 매일 발표된 명예의 전당의 최하위 점수를 return하는 solution 함수를 완성해주세요.
제한사항
- 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] |
나의 풀이
일단 문제부터 말해보자면 너무 효자 문제였다!!!! 최근들어 이렇게 빨리, 한번에 푼 문제가 있었을까 싶다.
빨리 풀게된 덕분에 다른 일들을 추가적으로 더 할 수 있었다.
문제를 보고 떠올린 순서는 다음과 같다.
1. score의 각 element들이 하루 하루 추가되는 점수들을 의미하기 때문에 각 일차별 score를 반복해서 하나씩 새로운 배열에 넣어주기.
2. 그 일차에 맞는 상위 3명의 명예의 전당 list 뽑아보기
3. 명예의 전당 list의 최소값 뽑기
4. 최소값을 차례로 새로운 배열에 넣어주기
사전에 이렇게 생각을 했고, 바로 풀 수 있었다. 너무행복해!!
코드를 보며 조금 더 자세하게 설명해보겠다.
function solution(k,score) {
let arr = [];
let top = [];
let answer = [];
score.forEach((el)=>{
arr.push(el);
// console.log("arr.push",arr)
arr.sort((a,b)=> b -a);
// console.log("sort",arr)
top = arr.slice(0,k);
// console.log("top",top)
answer.push(Math.min(...top));
// console.log("answer",answer)
})
return answer;
};
let k=3;
let score = [10,100,20,150,1,100,200];
console.log(solution(k,score));
우선 score의 각 element에 대해 작업을 진행해 주기 위해 forEach로 반복문을 돌려주었다.
처음에는 map 메서드를 사용할까 싶었지만 새로운 배열에 담는 작업을 여러번 할 것이었기 때문에 forEach로 구성했다. (물론 map을 시도해보지 않은 것은 아니다. 금방 forEach로 바꿨지만!)
그 후 forEach문 내에서 가장먼저 새로운 배열에 하나씩 넣어주었다.(과정①)
이 과정을 굳이 해 준 이유는 1일차, 2일차, 3일차를 가정하고 그에 맞는 작업을 수행해야 했기 때문이다.
예를 들면 1일차에는 10점짜리 한명, 2일차에는 10점짜리 한명, 100점 짜리 한명 , ... 이런식으로 진행되기 때문에 이런 순서를 나타내주고 싶었다.
일단 각 일차별 배열들을 설정해주었기 때문에 일차에 따른 작업들만 해주면 됐다.
상위 3명의 명단을 뽑아 명예의 전당 리스트를 뽑아주었다.
상위 3명의 명단을 뽑는 건 배열을 내림차순으로 정렬한 뒤 앞의 3명을 slice로 잘라 새로운 배열인 top으로 가져오도록 했다.(과정 ②)
그런 다음 명예의 전당 최소값을 뽑기 위해 Math.min을 이용해 최소값을 만들어 주었다.(과정③)
마지막으로 최소값의 명단을 list 형태로 넣어주기 위해 다른 배열에 넣어주었다.(과정④)
문제를 풀며 들었던 생각을 조금 정리해보려고 한다.
이번 문제풀이는 개인 project를 진행하며 공부하게된 fetch라는 함수에서 영감을 얻어 작성하게 되었다.
이 문제와는 상관없는 이야기이지만 fetch를 사용하면서 데이터의 값을 promise, then을 이용해 가져오는 작업을 했었는데리턴된 데이터를 fetch안에서 모두 변형시킨 뒤 사용했었다.
이처럼 forEach에 적용해 사용해봤다. forEach안에서 작업하게되면 각 일차에 따른 순서를 보장받을 수 있기 때문에 작업을 좀 더 편하게 할 수 있었던 것 같다.
두서없이 적었지만 이 내용을 적게된 이유는 'forEach내에서는 생각보다 다양하게 변수들을 변형시키고 담고, 꺼내는 작업을 '순서를 보장받으며' 할 수 있었다는 것이다.(반복문이 한번 돌아갈 때 마다 그 반복문 한번 한번에 모든 작업들을 넣었기 때문에)
메서드의 응용은 아직 초보지만 오늘도 또 하나 더 배운다.
'Algorithm' 카테고리의 다른 글
2016년 [프로그래머스] (1) | 2023.10.20 |
---|---|
카드 뭉치 [프로그래머스] (1) | 2023.10.19 |
콜라 문제 [프로그래머스] (0) | 2023.10.19 |
두 개 뽑아서 더하기 [프로그래머스] (0) | 2023.10.19 |
푸드 파이트 대회 [프로그래머스] (1) | 2023.10.17 |