개요

문자열 배열이 주어지는데 이때 가장 많이 사용된 단어 순서대로 정렬하여 k만큼 리턴하는 문제였다.

 

만약 사용된 단어의 갯수가 같다면 lexicographical order순으로 정렬하여 리턴하라고 되어있었다.

lexicographical order란 단순하게 알파벳순으로 정렬을 의미했고 js에서는 sort()를 사용하면 lexicographical order 순서대로 정렬된다는 것은 금방 알 수 있었다. 

 

 

Top K Frequent Words - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

풀이

다른 사람의 코드를 보면서 해쉬로 만들었을 때 그냥 해쉬 키로 배열 돌리면 됐었다, 근데 나는 해쉬를 배열화 시켜서 배열로 돌리느라 코드가 길어졌다.

 

그리고 배열로 만들어 sort로 정렬했을 때 숫자 순서대로는 정렬이 됐지만 알파벳 순서론 제대로 정렬되지 않았다.

 

그래서 그냥 해쉬 자체를 알파벳순으로 정렬할 수 있게 맨 위에서 들어오는 배열을 정렬시켜줬다.

 

이후 몇몇 코드를 참조해보니 비교시 localeCompare를 사용하는 것을 알았다.

 

마지막으로 해쉬를 만들 때 has를 통해 분기하여 해쉬맵을 만들어줬는데

for(let n of words)  map.set(n, (map.get(n) || 0) +1)

|| 연산자를 쓰면 간단하게 만들 수 있다는 것을 알 수 있었다

/**
 * @param {string[]} words
 * @param {number} k
 * @return {string[]}
 *
 * words 배열과 k 갯수가 주어지는데ㅔ
 * 문자열이 많이 반복된 순서대로 정렬하고 k 갯수만큼 리턴한다.
 *
 * 이때 words는 사전적 순서로 정렬되어야한다
 */
var topKFrequent = function (words, k) {
  const check = [];
  const map = new Map();
  words.sort();

  for (const word of words) {
    if (map.has(word)) {
      map.set(word, map.get(word) + 1);
    } else {
      map.set(word, 1);
      check.push(word);
    }
  }

  const sortArray = [...map]
    .sort(([prevKey, prevValue], [currKey, currValue]) => currValue - prevValue)
    .map((v) => v[0]);

  return sortArray.slice(0, k);
};
복사했습니다!