JavaScript 최빈값 구하기 : Map 객체 활용

zwundzwzig·2022년 11월 9일
2

algorithm

목록 보기
3/12
post-thumbnail

자바스크립트로
최다 빈도 값
구하기 ➡️ Map 객체를 활용해 풀어보았다.

Map 객체

ES6부터 새롭게 도입된 개념으로, 키와 값을 연결하기 위해 사용하는 데이터 유형이다. 프로토타입은 Object.

MDN에 따르면 Map 객체는,

  • 기존 객체와 달리 다양한 타입, 심지어 객체로도 키를 설정할 수 있으며,
  • 객체와 달리 자료를 반복할 수 있어 for-of나 스프레드 연산자를 사용 가능하며,
  • 배열처럼 삽입된 순서나 크기를 구하기 쉽다.
  • 실행 시까지 키를 알수 없고, 모든 키와 값들이 동일한 type일 경우 사용하기를 추천한다.

메서드 및 사용법

  • new Map() : 일반 생성자 함수와 같이 변수처럼 사용 가능하다.
  • map.set(key, value) : 객체와 비슷하게 키와 값을 한 번에 선언할 수 있다. 체이닝도 가능.
  • map.get(key) : 객체와 비슷하게 인자에 키를 넣어 값이나 undefined를 반환한다.
  • map.has(key) : 데이터 존재 유무를 Boolean 값으로 반환한다.
  • map.delete(key) : 키로 값을 제거한다.
  • map.clear() : 모든 데이터를 삭제할 수 있다.
  • map.size : 데이터 갯수를 반환한다.
  • map.keys() : iterable 키에 대해 반복 가능한 값을 반환한다.
  • map.values() : iterable 값에 대해 반복 가능한 값을 반환한다.
  • map.entries() : iterable 객체로 반환되며 각 값은 [key, value] 형태이다.
  • map.next() : entries 메소드로 반환된 이터러블 객체 뒤에 활용돼 순차적으로 value, done 프로퍼트 제공.

for..of 구문과 활용

let blueprint = new Map([
  ['naver', "green"],
  ['kakao', "yellow"],
  ['woowahan', "sky"]
]);

for (let [k, v] of blueprint) {
  return [k, v] // ['naver', "green"], ['kakao', "yellow"], ['woowahan', "sky"]
}

for..of 구문과 활용이 가능하며 한 번에 키와 값을 받아낼 수도 있다.

예시 - programmers : 최빈값 구하기

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다.
정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요.
최빈값이 여러 개면 -1을 return 합니다.
function solution(array) {
    let counting = new Map();
    let countArray = new Array;
    let max = 0;
    for(let i of array) {
        if(!counting.has(i)) counting.set(i, 0);
        if(counting.has(i)) counting.set(i, counting.get(i)+1);
        while(counting.get(i) > max) max++;
    }

    for (let [k, v] of counting) {
        if(v === max) countArray.push(k)
    }
    
    return countArray.length === 1 ? countArray[0] : -1;
}
  1. 우선적으로 Map 객체와 배열, 그리고 숫자 0을 준비해뒀다.
  2. 그리고 첫 번째 for...of 문에서 주어진 배열을 셌는지 유무를 파악하고, 셌다면 map.set() 메소드를 활용해 해당 인덱스를 키로, 갯수를 값으로 할당했다.
  3. 이후 기존 키에 해당하는 숫자를 또 세게 된다면 값에 1을 더해줬다.
  4. while 문을 활용해 가장 최다 갯수를 max 변수에 할당했다.
  5. 두 번째 for...of 문에선 max 변수와 일치하는, 즉 최다 갯수인 값을 찾아 준비해뒀던 배열에 넣어줬다.
  6. 마지막으로 해당 배열의 인덱스가 두 개 이상일 경우, 즉 최빈값이 복수일 경우 -1을 반환하며 리턴했다.

참조

profile
개발이란?

0개의 댓글