회장 선거(coding test)

겨우겨우 풀었다. 몇가지 테스트를 통해서 문제가 정답이 나오는 것을 확인 검수도 받았다.

문제 회장선거

현수네 반은 오늘 회장선거를 합니다. 현수네 반 N명의 학생은 각자 자기가 좋아하는 학생을
회장후보로 추천합니다. 한 학생이 여러명을 추천할 수 있습니다.
추천횟수가 k번 이상인 학생들만 회장선거에 출마할 수 있습니다. 회장선거에 출마한 학생들
은 자기를 추천해준 학생들에게 감사의 이메일을 보내기로 했습니다.
매개변수 votes에 추천정보가 주어지면 0번 학생부터 N-1번 학생까지 각 학생이 감사이메일
을 받는 횟수를 알아내는 프로그램을 작성하세요

정답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function solution(n,votes, k) {
let result=Array(n).fill(0)
let elected=[]
let sH=new Map()

for(let x of votes){
sH.set(x[1],(sH.get(x[1])||0)+1);
}

let resultArr=Array.from(sH)
resultArr.map((e,i)=>{
if(i<n){
if(e[1]>=k){
elected.push(e[0])
}
}
})
votes.map(e=>{
elected.map(item=>{
if(item===e[1]){
for(let i=0;i<n;i++){
if(e[0]===i){
result[i]+=1
}
}
}

})
})

return result


}

살짝 순서대로 설명을 하자면 먼저

  1. 맵핑을 한뒤 회장 선거에 나오는 사람을 검색한다. sH.set(x[1],(sH.get(x[1])||0)+1);
  2. 결과를 맵으로 변경한뒤에 투표수가 k이상 인 사람을 체크
    if(e[1]>=k){ elected.push(e[0]) }
  3. 전체 결과를 map으로 돌린뒤에 투표한 사람과 당선된 사람을 비교하여 초기에 만들어둔
    배열에 존재할 때마다 하나씩 추가해준다. if(e[0]===i){ result[i]+=1 }

한시간 이상은 걸린 것 같다. 일단 문제 푸는 것에 주력하고 나중에는 시간도 단축할 수 있도록 노력해보자