안오늘 2021. 7. 9. 21:21

제코베 자바스크립트 37번, 반장선거

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

const array = prompt('이름을 입력해주세요.').split(' ');
let result = {};
let winner = "";

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

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

입력

원범 원범 혜원 혜원 혜원 혜원 유진 유진

출력

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

 

 

딕셔너리 형태로 이름을 key개수를 value로 하려고 한다.

for in 형태는 인덱스를 돌아가면서 한다.

array 배열에 있는 해당 인덱스의 값을 val에 담고, 즉 이름을 담고,

result 딕셔너리에 val을 key로 하고 result[val]을 value로 하는데,

그 값이 undefined이면 1로 하고, undefined가 아니라면 현재 value값에 1을 증가시키면서, 해당 이름이 몇 번 나왔는지 count를 센다.

 

Object.keys(result)를 통해 result 배열의 key들만 있는 배열에 reduce()를 사용한다.

reduce()는 빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback함수를 한번씩 실행한다.

reduce함수에서 a, b를 인수로 하는데, a는 accumulator 누산기로 콜백함수의 반환값을 누적한다.

콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서, initialValue를 제공한 경우에는 initialValue값이다.

즉, 여기서는 initialValue를 제공하지 않았기 때문에, accumulator는 배열의 첫번째 값인 원범이고,

b는 currentValue로 처리할 현재 요소인데 여기서는 배열의 두번째 값인 혜원이다.