[javascript알고리즘] 학급회장 - 해쉬함수

이아현·2023년 6월 8일
0

코딩테스트

목록 보기
18/31
post-thumbnail

✅ 문제 설명

학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다. 투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다. 선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요. 반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다.

👩‍💻 나의 풀이

const solution = (str) => {
  const obj = { A: 0, B: 0, C: 0, D: 0, E: 0 };

  var splitStr = str.split("");
  var keys = Object.keys(obj); // key값들의 배열

  // 이중 for문으로 splitStr과 keys의 요소 비교하여 일치하면 +1
  for (let i = 0; i < splitStr.length; i++) {
    for (let j = 0; j < keys.length; j++) {
      if (splitStr[i] === keys[j]) {
        obj[splitStr[i]]++;
      }
    }
  }
  // obj : {A: 3, B: 3, C: 5, D: 2, E: 2}

  var values = Object.values(obj);
  // maxIdx : obj의 value값 중 최대값의 index번호
  var maxIdx = values.indexOf(Math.max(...values));

  return keys[maxIdx];
};

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

📃 해설 풀이 (map객체 사용)

function solution(str) {
  let answer = "";

  let hash = new Map();

  // map객체에 기호와 횟수를 넣는 과정
  // set : map객체에 주어진 키와 값을 추가, 업데이트
  // has : map객체에 주어진 키에 해당하는 요소 존재 여부 확인
  // get : map객체에 주어진 키에 해당하는 요소 반환
  for (let s of str) {
    if (hash.has(s)) hash.set(s, hash.get(s) + 1);
    else hash.set(s, 1);
  }

  let max = Number.MIN_SAFE_INTEGER; // 충분히 작은 수
  // hash 객체에서 [key, value] 타입으로 하나씩 꺼내기
  for (let [key, value] of hash) {
    if (value > max) {
      max = value;
      answer = key;
    }
  }

  return answer;
}

let str = "BACBACCACCBDEDE";
console.log(solution(str));
profile
PM을 지향하는 FE 개발자 이아현입니다 :)

0개의 댓글