간만에 친구를 만나고, 술 마시고 오느라 졸리네오....
일단 제가 밀린 공부들이 있으니, 이를 해야 하는 것도 맞아서, 오늘도 새벽 코딩 중입니다.
이 예제는 제가 아주 자바스크립트 입문 일주일 때쯤 봤던 문제였어요. 그때는 해시이니 뭐니 아무것도 몰랐는데, 이런 게 해시군요!
간만에 보니 기분이 묘했는데, 옛날보다 좀 더 구조를 짜면서 하니, 그때보다 훨씬 시간도 단축돼서 당연한 거지만 기분은 좋네요. 그럼 시작해보겠습니다 🌈
이 문제를 오랜만에 봤을 때 제 풀이과정은 다음과 같았어요.
- 핵심은 결국 제한사항에 들어있다. 이를 만족하면 된다.
- 가. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 나. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
- 인덱스를 지정하고, 관리하면 좀 더 편할 것 같다. 해시테이블을 적극적으로 사용하자!
- 만약 해시테이블을 사용한다면 내부에 인덱스를 만들어놔야 편할 것이다. 안 그렇다면 전체
genres
를 탐색하면서 O(n)이 걸릴 것이기 때문이다. 따라서 인덱스와 전체 횟수를 따로 객체 형태로 관리해준다.- 나중에 정렬을 통해 각 장르들의 순위를 관리하고, 그 안에서 앨범들의 순위를 또 관리해서 최대 2개씩 출력한다. 이때,
slice
배열 메소드의 특성을 적극적으로 활용하자!
const solution = (genres, plays) => {
let answer = [];
/*
genreObj = {
key: { // 장르
indicies: <Array>, // index를 담아놓는 배열
playCount: <number> // 현재 장르가 실행된 총 횟수
}
}
*/
const genreObj = {};
genres.forEach((genre, index) => {
genreObj[genre] = genreObj[genre] ? {
indicies: [ ...genreObj[genre]["indicies"], index ],
playCount: genreObj[genre]["playCount"] + plays[index]
} : {
indicies: [ index ],
playCount: plays[index]
}
})
const GenresRankArr = Object.values(genreObj).sort((a, b) => b["playCount"] - a["playCount"]);
GenresRankArr.forEach(({ indicies }) => {
indicies.sort((a, b) => (plays[b] !== plays[a]) ? (plays[b] - plays[a]) : (a - b));
answer = [ ...answer, ...indicies.slice(0, 2) ]
})
return answer;
}
맞았어오!!!
다시 보니, 코드는 여전히 엉망이네요.
띄어쓰기가 전혀 돼있지 않는 것과, key
같은 경우도 어떤 때는 .key
을 이용해서 했는데 어떤 때는 또 [key]
형태로 썼었어요. (지금은 수정한 상태)
여전히 깔끔한 코드를 작성하기에는 반성해야할 것 같아요. 이상!