programmers.co.kr/learn/courses/30/lessons/42579#
처음으로 풀어보는 level3 문제
거의 4~5시간은 걸린 것 같다 ㅠㅠ
후...코딩테스트...1문제라도 제대로 풀 수 있을까???
[알고리즘 flow]
1. Key : value 타입으로 고유번호, 장르, 재생수를 만들어준다.
2. 해시 리스트를 순회 하면서 각 장르별 재생수의 총합을 구한다.
3. 해시 리스트를 장르별, 재생수별 내림차순으로 정렬하고 각 장르별 랭킹의 리스트도 내림차순으로 정렬한다.
4. 랭킹의 리스트와 해시의 리스트를 비교해가며 각각의 장르를 2개 또는 1개씩 배열에 담아 출력한다.
이런식으로 코딩을 작성하였는데, 3번까지는 어렵지 않게 할 수 있었으나 마지막이 조금 많이 꼬였다.
일반적으로 많이 틀리는 5~14번 테스트 케이스 실패는 내 정렬의 문제였다.
장르는 오름차순, 재생수는 내림차순으로 정렬하여 순서대로 출력하니 해결이 되었는데,,,
문제는 9번 케이스가 계속 오류가 나는 것이었다.
이것 때문에 계속 머리를 싸매고 있었는데,
아래 3가지 단계로 해결이 가능했다.
랭킹 리스트의 길이만큼 반복하면서 [i] 번지일때마다 해시의 리스트를 모두 비교해준다.
1. 랭킹 리스트의 [i]번지의 장르가 해시 리스트의 [j]번지의 장르와 같다면? 카운트를 1올려주고, answer배열에 해당 장르의 고유번호를 넣어준다.
2. 그러다가 카운트가 2가 되는 순간 카운트를 0으로 초기화 하고, 랭킹 리스트의 다음 [i]번지 포문으로 넘어가기 위해 안쪽 포문을 break한다.
3. 그런데 만약에 카운트가 1이면서 해시 리스트의 마지막 번지에 도착해있거나 해시 리스트의 [j]번지가 랭킹 리스트의 [i] 번지와 다르다면? 카운트를 0으로 초기화 하고 안쪽 포문을 break 한다.
이렇게 다시 심기일전 하여 작성하니 테스트 통과가 되었다.
[나의 코드]
function test() {
var genres = ['c','a','b','a','a','b','b','b','b','c','c','c','d'];
var plays = [1,500,9, 600, 501, 800,500,300,2,2,1,2,100000];
solution(genres, plays);
}
function solution(genres, plays) {
var answer = [];
var list = new Array();
for (let i = 0; i < genres.length; i++) {
// 장르, 재생수, 고유번호를 JSON 타입으로 넣어준다.
var data = new Object();
data.number = i;
data.genres = genres[i];
data.play = plays[i];
list.push(data)
}
list.sort(function (a, b) {
// 장르순 -> 재생순으로 오름차순 정렬해준다.
if(a.genres < b.genres) {
return -1;
} else if (a.genres > b.genres) {
return 1;
} else {
if (a.play > b.play) {
return -1;
}
return 0;
}
})
console.log(list)
var playRank = new Array();
// 재생수 랭크가 내림차순으로 담길 예정인 배열
var plays = 0;
for (let i = 0; i < list.length; i++) {
// 리스트 순으로 정렬해서 장르가 몇개인지 체크한다.
// 그러면서 장르별 합계도 체크하여 담아준다.
plays += list[i].play;
if (i == list.length-1) {
var data = new Object();
data.genres = list[i].genres;
data.plays = plays;
playRank.push(data)
} else {
if (list[i].genres != list[i+1].genres) {
var data = new Object();
data.genres = list[i].genres;
data.plays = plays;
plays = 0;
playRank.push(data)
}
}
}
playRank.sort(function (a, b) {
// 재생수 랭킹 내림차순으로 정렬
return b.plays - a.plays;
})
console.log(playRank)
var count = 0;
for (let i = 0; i < playRank.length; i++) {
// 재생수 랭킹 만큼 반복하여 각각의 장르를 2개 or 1개만 출력할 것이다.
for (let j = 0; j < list.length; j++) {
if (playRank[i].genres == list[j].genres) {
// 리스트에 장르와 랭킹의 장르가 같다면
++count;
// 카운트를 1 올려주고
answer.push(list[j].number)
// answer 배열에 해당 장르의 number를 푸시한다.
if (count == 2) {
// 그러다가 카운트가 2 가 되면 카운트를 0으로 초기화 하고 안쪽 포문을 멈춰준다. 2개 이상 출력할필요 없으니
count = 0;
break;
} else if (count == 1 && playRank[i].genres != list[j].genres || list.length-1 == j) {
// 그런데 카운트가 1이면서 for문이 끝에 도착했거나 현재 랭킹의 장르와 리스트의 장르가 다르다면
// 해당 장르는 1개만 있는 것이니 0으로 초기화 하고 안쪽 포문을 멈춰준다.
count = 0;
break;
}
}
}
}
console.log(list)
console.log(answer)
return answer;
}
사실 level3 문제 같지는 않았다. 그 중에서도 쉬운 편에 속하는 건가?.. 아니면 내가 조금 더 잘해진건가?...
자만하지 말고 달려본다.
[깃허브]
https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level03/bestElbum.js
'문제풀이 > 프로그래머스' 카테고리의 다른 글
더 맵게 / 프로그래머스 연습문제 / programmers / level2 / java / 힙 (0) | 2021.05.13 |
---|---|
소수 찾기 / 프로그래머스 코딩테스트 / programmers / level2 / 완전탐색 / Java (0) | 2021.05.12 |
가장 큰 수 / 프로그래머스 연습문제 / programmers / level2 / 정렬 / JavsScript (0) | 2021.05.10 |
다리를 지나는 트럭 / 프로그래머스 연습문제 / programmers / level2 / 스택,큐 / javascript (0) | 2021.05.09 |
프린터 / level2 / 프로그래머스 연습문제 / programmers / 스택,큐 / java (0) | 2021.05.08 |