혼자 적어보는 노트

프로그래머스 데브코스 TIL - Day 4 본문

스터디

프로그래머스 데브코스 TIL - Day 4

jinist 2022. 3. 24. 23:03

 

 학습 목차

- [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을 사용하면서 배열로 변경하는 등 다양하게 나왔는데

실습을 더 해봐야겠다고 느꼈다!

 


✍ 느낀점

 

자료구조와 알고리즘을 이용해서 문제를 푸는것이 익숙하지 않아서

실습하는 과정이 꽤나 어려웠다.. 

이해가 잘 안되어서 이해해보려고 코드를 계속 읽어보고 흐름을 따라가보기도 하고
다 지우고 흐름만 기억해서 다시 써보기도 하고 여러차례 해보았다..

지금은 이해했지만 내일의 나는 어떨지 모르겠다 😂

반복적으로 다양한 문제를 직접 풀어봐야 머리와 손에 익을 것 같다!

Comments