프로그래머스 데브코스 TIL - Day 4
✅ 학습 목차
- [Day 4] JavaScript 주요 문법 (4)
✅ 새롭게 학습한 부분
- Queue
- 해시테이블
Queue
queue 를 Array형식과 연결리스트 형식으로 구현하는 방법을
알게되었다.
🔥queue문제에서 shift를 쓰면 안된다고?
지금까지 queue관련 문제가 나왔을 때 shift로 해결을 했었는데
shift()를 사용하면 O(n)의 시간복잡도를 가지기 때문에
array형식과 연결리스트 형식으로 구현하는 것이 좋다고 한다.
+ 제한사항이 작을 경우 shift를 사용해도 된다.
연결리스트를 사용한 큐 방식이 아직은 조금 어색해서
버벅대면서 했다😢😢
해시테이블
키와 값을 받아 해싱하여 나온 index에 값을 저장하는 선형 자료구조
삽입은 O(1)이며 키를 알고 있다면 삭제, 탐색도 O(1)으로 수행한다.
✍ 실습
처음작성한 코드 (실패)
function solution(genres, plays) {
let answer = [];
let albums = {};
for (let i = 0; i < plays.length; i++) {
if (!albums[genres[i]]) {
albums[genres[i]] = [];
albums[genres[i]]["max"] = 0;
}
albums[genres[i]].push([plays[i], i]);
albums[genres[i]].max += plays[i];
}
let keys = Object.keys(albums).sort((a, b) => albums[b].max - albums[a].max); // 가장 많이 재생된 장르 알아내기
for (let i = 0; i < 2; i++) {
albums[keys[i]].sort((a, b) => b[0] - a[0]); // 앨범의 장르 재생시간 정렬
if (albums[keys[i]].length <= 1) {
answer.push(albums[keys[i]][0][1]);
} else {
answer.push(albums[keys[i]][0][1]);
answer.push(albums[keys[i]][1][1]);
}
}
return answer;
}
처음에 이렇게 어디 내놓기도 창피한 이상한 코드를 작성했었고..🙄
예상했듯 채점란에서 심각한 점수가 나왔다..
albumList.sort((a, b) => {
if (a.genre !== b.genre) return albumsTime[b.genre] - albumsTime[a.genre]; // 총 재생 시간 순서대로 정렬
if (a.time !== b.time) return b.time - a.time; // 각 재생 시간 순서대로 정렬
});
코드를 수정해보는 와중에 정렬을 몇번 씩 하면서 정렬에 대해 조금은 감이 잡혔다.
물론 해설코드에서는 이렇게 복잡하게 정렬을 하진 않았지만 정렬을 디테일하게 할 수 있고
정렬에 대한 동작 방식에 대해 알게 되었다.
이후 코드 해설을 보며 아직 갈길이 멀다는 것을 깨달았다😭
메서드들을 연결해서 푸는게 아직 익숙하지 않아서 하나씩 익히기가 어려웠지만 재밌었다.
{'key' => {...}, 'key2' => {...}} 형식의 map에 [...map]을 사용하면
['key', {...}] ['key', {...}]으로 형식이 바뀐다는 것을 알게되었다. 👍
Map함수와 flatMap을 사용하면서 배열로 변경하는 등 다양하게 나왔는데
실습을 더 해봐야겠다고 느꼈다!
✍ 느낀점
자료구조와 알고리즘을 이용해서 문제를 푸는것이 익숙하지 않아서
실습하는 과정이 꽤나 어려웠다..
이해가 잘 안되어서 이해해보려고 코드를 계속 읽어보고 흐름을 따라가보기도 하고
다 지우고 흐름만 기억해서 다시 써보기도 하고 여러차례 해보았다..
지금은 이해했지만 내일의 나는 어떨지 모르겠다 😂
반복적으로 다양한 문제를 직접 풀어봐야 머리와 손에 익을 것 같다!