JavaScript

[JS] 코딩테스트 037 * 꼭 복습하기~!

Irene1988 2025. 2. 17. 22:11
문제37 : 반장 선거

새 학기를 맞아 호준이네 반은 반장 선거를 하기로 했습니다.
그런데 표를 하나씩 개표하는 과정이 너무 번거롭게 느껴진 당신은
학생들이 뽑은 후보들을 입력받으면 뽑힌 학생의 이름과 받은 표 수를 출력하는
프로그램을 작성하기로 하였습니다.

/*
입력
원범 원범 혜원 혜원 혜원 혜원 유진 유진

출력
혜원(이)가 총 4표로 반장이 되었습니다.
*/
const array = ["원범","원범","혜원","혜원","혜원","혜원","유진", "유진"];

let result = {};
let winner = "";

for(let index in array){
    let val = array[index];
    result[val] = result[val] === undefined ? 1 : result[val] = result[val] +1;
}
console.log(result);

winner = Object.keys(result).reduce(function(a, b){
    console.log(a,b);
    return result[a] > result[b] ? a : b;
});

console.log(winner);
console.log(`${winner}(이)가 ${result[winner]}표로 반장이 되었습니다!`);

 

*헐 이거 내용이 어렵다.

다시 복습 필수

 

1. 코드 개요

  • 투표 데이터가 담긴 배열 array를 사용
  • 객체(result)를 활용하여 각 후보가 받은 표 수를 저장
  • Object.keys().reduce()를 사용해 가장 많은 표를 받은 후보를 찾음
  • 최종적으로 반장 당선자를 출력

2. 코드 분석

📌 Step 1: 투표 데이터 배열

const array = ["원범", "원범", "혜원", "혜원", "혜원", "혜원", "유진", "유진"];

 

  • 학생들이 투표한 이름 목록 배열입니다.
  • "원범", "혜원", "유진"이 포함되어 있습니다.

📌 Step 2: result 객체를 이용해 투표 개수 세기

let result = {}; // 빈 객체 선언
let winner = ""; // 반장 변수

for (let index in array) {
    let val = array[index]; // 현재 이름
    result[val] = result[val] === undefined ? 1 : result[val] + 1;
}

 

 

📌 설명

  • result 객체를 이용해서 각 후보가 몇 표를 받았는지 저장
  • for...in 문을 사용하여 array를 순회
  • 각 이름(val)이 result 객체에 없으면 1로 초기화
  • 이미 있으면 기존 값에 +1 증가

📌 작동 과정

  • array[0] → "원범" → { "원범": 1 }
  • array[1] → "원범" → { "원범": 2 }
  • array[2] → "혜원" → { "원범": 2, "혜원": 1 }
  • ...
  • 최종적으로 { "원범": 2, "혜원": 4, "유진": 2 } 가 됩니다.

🔹 출력 확인

console.log(result);
// { 원범: 2, 혜원: 4, 유진: 2 }

 

📌 Step 3: reduce()를 이용해 최다 득표자 찾기

winner = Object.keys(result).reduce(function(a, b) {
    console.log(a, b); // 과정 확인
    return result[a] > result[b] ? a : b;
});

 

📌 설명

  • Object.keys(result) → ["원범", "혜원", "유진"]
  • reduce()를 사용해 가장 많은 표를 받은 후보(winner) 찾기
  • a와 b 중 더 많은 표를 가진 사람을 반환

📌 작동 과정

a b result[a] result[b] 반환값
"원범" "혜원" 2 4 "혜원"
"혜원" "유진" 4 2 "혜원"

✅ 최종적으로 "혜원"이 선택됩니다.

 

 

📌 Step 4: 결과 출력

console.log(`${winner}(이)가 ${result[winner]}표로 반장이 되었습니다!`);

 

📌 출력 결과

혜원(이)가 4표로 반장이 되었습니다!

3. 코드 리팩토링 (더 간결하게)

위 코드를 더 간결하게 만들 수 있습니다.

const array = ["원범", "원범", "혜원", "혜원", "혜원", "혜원", "유진", "유진"];

let result = array.reduce((acc, name) => {
    acc[name] = (acc[name] || 0) + 1;
    return acc;
}, {});

let winner = Object.keys(result).reduce((a, b) => result[a] > result[b] ? a : b);

console.log(`${winner}(이)가 ${result[winner]}표로 반장이 되었습니다!`);​

 

📌 개선된 점

  • reduce()를 이용해 객체 생성 (result)
  • || 0을 사용하여 undefined 방지
  • 전체 코드가 더 짧고 직관적

4. 결론

result 객체를 활용해 투표 개수를 저장
reduce()를 사용해 최다 득표자를 찾음
출력 포맷을 맞춰서 결과 출력

📌 이해 포인트

  • 객체를 활용한 빈도수 계산
  • reduce()를 이용한 최댓값 찾기
  • Object.keys()로 객체 키 순회

 

https://irene2023.tistory.com/28

 

[JS] 코딩테스트 008 - 객체****

문제8 : 객체의 키 이름 중복 자바스크립트 객체를 다음과 같이 만들었다. 출력값을 입력하시오. (출력값은 공백을 넣지 않습니다. ) let d = { 'height':180, 'weight':78, 'weight':84, 'temperature':36, 'eyesight':1}

irene2023.tistory.com

 

https://irene2023.tistory.com/58

 

[JS] some()과 reduce()에 대해~

🔹 some() 메서드란?📌 배열의 요소 중 하나라도 조건을 만족하면 true 반환📌 모든 요소가 조건을 만족하지 않으면 false 반환📌 filter()나 map()보다 빠르게 검사 가능 (하나만 찾으면 바로 종료됨)

irene2023.tistory.com

 

*위 포스팅은 챗GPT 답변을 토대로 작성했습니다!