[JS 알고리즘] 학급 회장 문제 풀이 – 해시(Map)

주요 포인트 한눈에 보기

문자열 형태로 주어진 투표 결과에서 가장 많이 등장한 후보를 찾는 해시(빈도 집계) 문제입니다. 정답 풀이와 내가 작성한 풀이를 비교하여, 왜 출제자는 특정 풀이를 의도했는지를 구조적으로 정리합니다.

문제 설명

학급 회장을 뽑기 위해 후보 기호 A, B, C, D, E가 등록되어 있습니다.

투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)를 하나씩 작성하며,
선생님은 이 기호들을 순서대로 발표합니다.

선생님의 발표가 모두 끝난 후,
어떤 기호의 후보가 학급 회장이 되었는지를 출력하는 프로그램을 작성하세요.

반드시 한 명의 학급 회장만 선출되는 투표 결과만 주어진다고 가정합니다.

입력 설명

첫 번째 줄에는 반 학생 수 N이 주어집니다. (5 ≤ N ≤ 50)

두 번째 줄에는 N개의 투표용지에 쓰여 있던 각 후보의 기호가
선생님이 발표한 순서대로 문자열로 주어집니다.

출력 설명

학급 회장으로 선택된 후보의 기호를 출력합니다.


입력 예제
15
BACBACCACCBDEDE

출력 예제
C

내가 푼 풀이

function solution(s) {
  let arr = s.split("");

  let obj = arr.reduce((acc, cur) => {
    acc[cur] += 1;
    return acc;
  }, { A: 0, B: 0, C: 0, D: 0, E: 0 });

  let maxKey = null;
  let maxValue = -Infinity;

  for (const key in obj) {
    if (obj[key] > maxValue) {
      maxValue = obj[key];
      maxKey = key;
    }
  }

  return maxKey;
}

이 풀이는 후보가 A~E로 고정되어 있다는 문제 조건을 코드에 직접 반영한 방식입니다. 객체를 미리 초기화해 두고, 문자열을 순회하며 각 후보의 득표 수를 누적합니다.

동작 메커니즘은 단순합니다. 문자열을 배열로 변환한 뒤, reduce를 이용해 각 문자에 해당하는 카운트를 증가시키고, 이후 한 번의 반복으로 최댓값을 가진 키를 찾습니다.

실수하기 쉬운 포인트는 초기 객체에 없는 문자가 등장할 가능성을 고려하지 않았다는 점입니다. 현재 문제에서는 조건상 문제가 없지만, 입력 조건이 조금만 바뀌면 런타임 오류 또는 잘못된 결과로 이어질 수 있습니다.

개선 방향으로는 초기 객체를 하드코딩하지 않고, 등장하는 값만 동적으로 집계하도록 구조를 바꾸는 것이 좋습니다.

정답 풀이

function solution(s) {
  let answer;
  let sH = new Map();

  for (let x of s) {
    if (sH.has(x)) sH.set(x, sH.get(x) + 1);
    else sH.set(x, 1);
  }

  let max = Number.MIN_SAFE_INTEGER;
  for (let [key, val] of sH) {
    if (val > max) {
      max = val;
      answer = key;
    }
  }

  return answer;
}

정답 풀이는 후보의 종류를 사전에 가정하지 않습니다. 문자열을 순회하면서 실제로 등장한 문자만 Map에 저장하고, 그 빈도를 누적합니다.

이 방식의 핵심은 확장성입니다. 후보가 늘어나거나 문자 종류가 변경되더라도 코드 수정 없이 그대로 동작합니다.

또한 해시 구조를 사용해 시간 복잡도를 O(N)으로 유지하며, 이후 빈도 기반 문제들(아나그램, 최다 빈도 문자 등)에 그대로 재사용할 수 있는 패턴입니다.

출제 의도

이 문제는 단순 구현 문제가 아니라, 문자열 데이터를 집계할 때 어떤 자료구조를 선택해야 하는지를 묻는 문제입니다.

출제자는 반복문과 조건문보다, 해시(Map)를 이용한 빈도 집계 패턴을 자연스럽게 떠올리는지를 확인하고자 합니다.

따라서 결과가 맞더라도, 특정 조건에 강하게 의존한 풀이는 학습 목적이나 채점 기준에서 정답 예시로 채택되지 않는 경우가 많습니다.

이 문제는 이후 등장하는 해시 문제들의 기초 사고를 형성하기 위한 전형적인 입문 문제로 볼 수 있습니다.

QnA

Q. 내가 푼 풀이는 틀린 답인가요?
아닙니다. 현재 문제 조건에서는 완전히 올바른 답입니다. 다만 조건이 바뀌면 바로 수정이 필요하다는 한계가 있습니다.

Q. 왜 Map 풀이가 정답으로 제시되나요?
후보의 종류가 달라지거나 늘어나더라도 그대로 사용할 수 있는 범용적인 해시 패턴이기 때문입니다.

Q. 실전 코딩테스트에서는 어떤 풀이가 안전한가요?
조건 변화에 강한 Map 기반 풀이가 가장 안전하며, 출제 의도에도 가장 잘 부합합니다.

이 글이 마음에 드세요?

RSS 피드를 구독하세요!

댓글 남기기