loading
본문으로 바로가기

문제 설명

Medium

  • 문자열 배열 단어와 정수 k가 주어지면 가장 자주 사용되는 k 문자열을 반환합니다.
  • 가장 높은 빈도에서 가장 낮은 빈도로 정렬된 답변을 반환합니다. 빈도가 같은 단어를 사전순으로 정렬합니다.

 

접근

첫번째.

var topKFrequent = function(words, k) {
    let obj = {}
    let result = []
    words.forEach((val, idx)=>{
        if (obj[val] === undefined) {
            obj[val] = (obj[val] | 0) + 1;
        } else {
            obj[val] = obj[val] + 1;
        }
    });
    
    let max = 0;
    let sortable = []
    
    for (var name in obj) {
        if (max <= obj[name]) {
            max = obj[name];
        }
        sortable.push([name, obj[name]]);
    }
};
  • forEach 함수를 이용해 obj = { i: 2, love: 2, leetcode: 1, coding: 1 } 오브젝트의 개수를 찾는다.
  • 오브젝트 value 값을 기준으로 [ [ 'i', 2 ], [ 'love', 2 ], [ 'leetcode', 1 ], [ 'coding', 1 ] ] 내림차순 정렬한다.
  • 개수 k 를 기준으로 for문 통해 리턴한다.
  • 하지만... 결국 풀지 못했다. (조건 중. 가장 높은 빈도 + name이 사전순으로 정렬되어야 한다.)

 

두번째.

var topKFrequent = function(words, k) {
    let obj = {}
    words.forEach((val, idx)=>{
        if (obj[val] === undefined) {
            obj[val] = (obj[val] | 0) + 1;
        } else {
            obj[val] = obj[val] + 1;
        }
    });
    
    const result = Object.keys(obj).sort((a, b) =>
        obj[a] == obj[b] ? (a < b ? -1 : 1) : obj[a] > obj[b] ? -1 : 1
    );
    
  return result.slice(0, k);
};
  • forEach 함수를 이용해 obj = { i: 2, love: 2, leetcode: 1, coding: 1 } 오브젝트의 개수를 찾는다.
  • sort 함수를 통해 조건을 2개 넣는다.
  • obj[a] == obj[b] 가 같으면 val 값 내림차순 그리고, (a < b) 즉 사전적 정렬 오름차순으로 정렬한다.
  • 그리고 obj[a] != obj[b] 가 같지 않으면, val 값 오름차순으로 정렬한다.

 

후기.

hashmap + sorting 문제로, obj key를 이용한 정렬이 실무에서도 아주 유용하게 쓰일 것으로 생각되며, 함수들의 case들을 많이 접하고 복습해야겠다.

 

 

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