문제 설명
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들을 많이 접하고 복습해야겠다.
'프론트엔드 개발[Front-End Development] > Coding Test' 카테고리의 다른 글
[CT-L] 88. Merge Sorted Array (0) | 2022.11.21 |
---|---|
[CT-L] 215. Kth Largest Element in an Array (0) | 2022.11.21 |
[CT-L] 122. Best Time to Buy and Sell Stock II (0) | 2022.11.21 |
[CT-L] 1480. Running Sum of 1d Array (0) | 2022.11.14 |
[CT-L] 11. Container With Most Water (0) | 2022.11.14 |