ALGORITHM/Inflearn

효율성(해쉬) - 6. 학급 회장

Harimad 2022. 2. 23. 23:08

문제

A, B, C, D, E 의 사람이 있다

투표용지는 N개가 있다
N번째의 투표가 발표되면 
누가 반장으로 선출 되었는지 출력하는 함수 작성하라
반드시 한 명의 반장이 선출된다고 가정한다.

입력예제
15
BACBACCACCBDEDE

출력예제
C

 

문제에 사용되는 개념정리

 

Map객체: https://devdocs.io/javascript/global_objects/map

Map.prototype.set(): https://devdocs.io/javascript/global_objects/map/set

Map.prototype.has(): https://devdocs.io/javascript/global_objects/map/has

 

The Map object holds key-value pairs and remembers the original insertion order of the keys.

Any value (both objects and primitive values) may be used as either a key or a value.

 

A Map object iterates its elements in insertion order — a for...of loop returns an array of [key, value] for each iteration.

//Iterating over a Map
const iterable = new Map([['a', 1], ['b', 2], ['c', 3]]);

for (const entry of iterable) {
  console.log(entry);
}
// ['a', 1]
// ['b', 2]
// ['c', 3]

for (const [key, value] of iterable) {
  console.log(value);
}
// 1
// 2
// 3

 

풀이 코드1

 

function solution(s){  
  let answer;
  let sH = new Map();
  for (let x of s) { // B A C B A ...
    if (sH.has(x)) { // x가 sH Map obj에 이미 존재하면
      sH.set(x, sH.get(x) + 1); //sH[x] 에 기존 숫자에 1 더함
    } else sH.set(x, 1); //없으면 1로 초기화
  }

  let max = Number.MIN_SAFE_INTEGER;
  for (let [key, val] of sH) {
    // console.log(key, val); //B 3 | A 3 | C 5 | D 2 | E 2
    if (val > max) {
      max = val;
      answer = key;
    }
  }
  
  return answer; // C
}

let str="BACBACCACCBDEDE";
console.log(solution(str));

 

코드2

객체로 풀때 참고자료: 객체 내의 값 인스턴스 개수 세기

 

Array.prototype.reduce() - JavaScript | MDN

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

developer.mozilla.org

//내 풀이 코드
//reduce함수를 이용해서 객체를 만들고 key와 value 값을 매핑함
//만든 객체에서 value값이 최대인 key값을 출력하는 함수를 만듬

function solution(s){  
  let answer;
  let students = [...s];
  let countedNames = students.reduce((prev, curr) => {
    if (curr in prev) prev[curr]++
    else prev[curr] = 1;
    return prev;
  }, {});
  console.log(countedNames); //{B: 3, A: 3, C: 5, D: 2, E: 2}

  let max = 0;
  for (let x in countedNames) {
    if (max < countedNames[x]) {
      max = countedNames[x];
      answer = x;
    }
  }
  return answer; // C
}

let str="BACBACCACCBDEDE";
console.log(solution(str));

 

 

출처

 

 

자바스크립트 알고리즘 문제풀이(코딩테스트 대비) - 인프런 | 강의

자바스크립트(JavaScript)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 재미있게 풀 수 있는 기초 단계 문제부터 고급 알고리즘까지 단계별로 차근차근 배우도록 설계된 강좌입니다., - 강의

www.inflearn.com