[문제 링크]
크기가 n인 int 배열 nums
등장 횟수가 n / 2인 값 (Majority Element) 반환
Majority Element는 배열에 무조건 존재
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
const len = nums.length;
let count = {};
nums.forEach((v) => {
count[v] = (count[v] || 0) + 1;
});
const keys = Object.keys(count)
const max = keys.reduce((prev, curr) => {
if (count[prev] < count[curr])
prev = curr;
return prev;
}, keys[0]);
return max;
};
이번에는 object를 활용하였다.
우선 각 요소의 값을 key로 잡고 등장할 때마다 value를 1씩 증가해주었다.
{'3': 2, '2': 1} 이런식으로 object가 완성되면 (count) 가장 높은 값을 가지고 있는 key를 찾아야하므로 key값만을 추출한 배열을 만들어준다. (keys)
keys는 배열이므로 reduce를 사용하여 순회하면서 이전 key의 value보다 크다면 해당 key를 반환해준다.
초기값은 key배열의 첫 값을 사용하였다.
reduce로 찾은 최대값의 key를 반환하면 완성!
Accepted
Runtime 77ms (Beats 21.94%)
Memory 43.2MB (Beats 90.12%)
우선 object를 평소에 많이 써보지 않았기 때문에 그 사용법에 대해 조금 알게되었다. keys()로 key 값 배열을 뽑거나 values()로 value 값 배열을 뽑는 방법 등에 대해서 알 수 있었는데, object에는 array만큼 다양한 함수를 사용할 수 없어서 각각의 값들을 배열로 뽑고 사용해야한다는 점에 주의해야할 것 같다. 이번에는 시간이 부족하여 문제에 필요한 함수들만 알아봤지만 나중에 object용 함수들을 따로 정리해야겠다.
var majorityElement = function(nums) {
let numCount = {};
let currentMax = 0;
let currentE;
for (x of nums) {
numCount[x] = numCount[x] ? numCount[x] + 1 : 1;
if (numCount[x] > currentMax) {
currentMax += 1;
currentE = x;
}
}
return currentE;
};
위는 다른 사람의 코드인데, object에 등장 횟수를 집어넣는 방식은 똑같지만 한 번씩 체크할 때마다 max 값과 key 값을 갱신하며 별도의 최대값 찾기를 안한다는 것이 다른 점이었다. 사실 매우 간단한 거였는데 생각이 거기까지 미치지 못했다. 항상 더 빠르게 효율적인 코드를 생각할 수 있도록 노력해야겠다.