Majority Element

zoovely·2023년 6월 21일
0
post-thumbnail

💬 문제

[문제 링크]
크기가 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 값을 갱신하며 별도의 최대값 찾기를 안한다는 것이 다른 점이었다. 사실 매우 간단한 거였는데 생각이 거기까지 미치지 못했다. 항상 더 빠르게 효율적인 코드를 생각할 수 있도록 노력해야겠다.

profile
나도 할 수 있을까?

0개의 댓글