최빈값 구하기와 Map 객체

0

알고리즘

목록 보기
3/8
post-thumbnail

혹시나 잘못된 개념 전달이 있다면 댓글 부탁드립니다. 저의 성장의 도움이 됩니다.

문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

최빈값을 구하는 방법

  1. 배열을 객체화A하여 반복문으로 카운팅
  2. 키를 배열B로 추출(Object.keys(A))
  3. 키 배열B를 객체A의 벨류값 기준으로 정렬 : B.sort((a,b)=>A[b]-A[a])
  4. 정렬한 키의 0, 1번째 인덱스 값을 비교, 조건분기하여 return

**

코드 대신 접근 방식을 익히고 고민해보기 힌트만 적었습니다.


Map 객체

위의 방법은 반복문으로 객체를 만들었지만, Map 객체를 사용하여 배열만드는 만드는 경우도 많았다.
MDN : 키기반의 컬렉션, MDN : Map

  • ES6에 추가된 데이터 구조 (Object 객체와 비교 됨)

  • key와 value를 맵핑하여 저장
    -> [key, value] 형태로 반환

Object 혹은 Map중에 어느 것을 사용할지를 결정하는데 도움을 줄 두가지 팁이 있다:

  • 실행 시까지 키를 알수 없고, 모든 키가 동일한 type이며 모든 값들이 동일한 type일 경우에는 objects를 대신해서 map을 사용해라.
  • 각 개별 요소에 대해 적용해야 하는 로직이 있을 경우에는 objects를 사용해라.
  • Map 객체의 키는 문자열 타입 외에도 가능

  • Map 객체는 set 메서드로 추가한 순서로 반복
    : 객체는 배열처럼 순서가 없지만 Map의 경우 반복문을 돌릴 때 추가한 순서대로 동작한다.

  • Map 객체는 size 메서드로 크기 추출


map 인스턴스 생성

const capitalCity = new Map();

const capitalCity1 = new Map([['Korea', 'Seoul'],['USA', 'Washington']]);

map 메서드

/*----- key,value 쌍 추가 -----*/
capitalCity.set('Korea', 'Seoul');
capitalCity.set('USA', 'Washington');
// 체이닝 가능 :
//	capitalCity.set('Korea', 'Seoul').set('USA', 'Washington');

// case 1
for(const el of capitalCity){
    console.log("el :",el);
}
// case 2
for(const [key,value] of capitalCity){
    console.log("key, value :",key, value);
}
// case 3
console.log("구조분해 :",[...capitalCity]);

/*----- key,value 쌍 개수 조회 -----*/
capitalCity.size; // 2


/*----- key로 조회 -----*/
capitalCity.get('Korea') // 'Seoul'


/*----- key,value 쌍 제거 -----*/
capitalCity.delete('USA');
capitalCity.size; // 1


/*----- key 있는지 확인 -----*/
capitalCity.has('France'); // false


/*----- 초기화 -----*/
capitalCity.clear();
console.log(capitalCity.size) // 0

map 객체와 forEach()

배열의 forEach와 전달인자가 다르다.

  • 배열의 전달인자 순서 : element, index, 배열
  • Map(객체)의 전달인자 순서 : value, key, Map객체
capitalCity.forEach((value, key, map)=>{
  console.log(value, key, map)
});


풀이한 코드

function solution(array) {
    const map = new Map();
    array.forEach((el)=>{
        map.set(el, (map.get(el)|| 0)+1);
    })
    const maxAlign = [...map].sort((a,b)=>b[1]-a[1]);
    return (maxAlign.length ===1 || maxAlign[0][1]!==maxAlign[1][1])? maxAlign[0][0]: -1;
}

0개의 댓글