제주코딩베이스캠프 자바스크립트 100제를 공부하며 정리한 내용입니다. 문제와 정답 노션 링크(무료), 인프런 해설 강의(유료)
입력 받은 이름 중 가장 많이 나온 이름과 나온 횟수를 출력합니다.
// 입력
원범 원범 혜원 혜원 혜원 혜원 유진 유진
// 출력
혜원(이)가 총 4표로 반장이 되었습니다.
각 이름 별로 몇 표를 받았는지 정리하기 위해 객체 형태로 데이터를 저장합니다.
str = "원범 원범 혜원 혜원 혜원 혜원 유진 유진"
const strArr = str.split(" ") // 입력값 빈칸으로 요소 나누어서 배열 만들기
let result = {}; // 데이터 담을 객체
let winner = "" ; // 최다 득표자 이름 담을 변수
for (let i in strArr) { // 배열의 요소를 돌면서, 빈 객체에 키와 밸류를 넣는다.
let key = strArr[i]; // 해당 인덱스 이름 저장
result[key] = result[key] === undefined ? 1 : result[key] = result[key] + 1;
// result[key] 로 객체의 key 를 넣고, 그 키에 해당하는 value 값을 조건문으로 할당 (이름에 해당하는 카운트 넘버값 할당)
// 처음 원범이로 돌 때 {원범 : undefined} 이므로 value 에 1을 넣어줌.
// 그 다음 돌 때는 {원범 : 1} 이므로 1에 1을 더해줌.
// 새로운 이름이 나오면 또 1로 시작
}
이렇게 객체로 해당 이름의 숫자를 카운트하고나서 어떤 값이 제일 큰지 확인합니다. 객체의 키값만 반환하는 Object.keys() 메소드와 배열의 각 요소에 주어진 함수를 실행하고 하나의 결과값을 반환하는 reduce 메소드를 사용합니다.
winner = Object.key(result) // 이렇게 하면 객체의 키값, 이름만 출력
winner = Object.keys(result).reduce(function(a, b){ // 리듀스는 배열의 두 요소로 아래 함수를 실행하며 모든 요소를 비교할 때까지 반복
return result[a] > result[b] ? a : b // reslut[a] 는 해당 이름의 카운트 넘버이므로 비교해서 큰 이름으로 다시 비교
})
// 순환이 끝나면 중첩된 a, 이름을 반환
최종 값을 문자열로 출력하면,
console.log(`${winner} 가 총 ${result[winner]} 표로 반장이 되었다.`)