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 답변을 토대로 작성했습니다!