[JS] 문제37-반장선거 중복 개수 찾기/set

    문제

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

    - 입력 : 원범 원범 혜원 혜원 혜원 혜원 유진 유진

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

     

    풀이

    1. 중복 없는 값만 가지는 set을 이용하여 유일한 값을 뽑아내서 (변수명 : set) 배열로 만든다. (변수명 : setArr)

    2. input값과 유일한 값인 setArr와 비교하여 같으면 카운팅한다.

    • setArr[0] === arr[0] 은 "원범"이다. 값이 같으므로 count =1
    • setArr[0] === arr[2] 는 "원범" != "혜원" 이다. 다르므로 카운팅 해주지 않는다.
    • setArr[0]과 arr[7]까지 순회하면서 값을 비교한 후 카운팅 수를 countArr에 푸시해주고 count는 0으로 초기화 한다.
    • 그 다음 setArr[1] 과 arr[0]~arr[7]까지 앞선 순서처럼 진행한다.

    3. countArr의 배열 중 가장 큰 값을 추출하고 serArr에서 그 인덱스 값에 해당하는 값을 추출한다.

    4. 백틱을 이용하여 마지막 출력을 해준다.

    const input = "원범 원범 혜원 혜원 원범 혜원 유진 혜원";
    const arr = input.split(' ') //input을 배열로 만듦
    const set = new Set(arr); //중복된 값만 추출
    const setArr = Array.from(set) //set이 객체임으로 배열로 다시 바꿈 ["원범","혜원","유진"]
    
    let countArr = [];
    
    for(let i = 0; i<setArr.length;i++){
      let count = 0; //두 번째 for문이 끝나면 countArr에 값을 넣고 카운팅 개수 초기화
      for(let j =0; j<arr.length;j++){
        if(setArr[i] === arr[j]){ 
          count++
        }
      } countArr.push(count)
    }
    const countMax = Math.max(...countArr) //카운팅배열 중 가장 큰 값을 추출하고
    const maxName = setArr[countArr.indexOf(countMax,0)] // 인덱스 값에 해당되는 값을 저장함.
    
    console.log(`${maxName}(이)가 총 ${countMax}표로 반장이 되었습니다.`)

     

    추가 풀이

    reduce를 사용하여 {"name":중복된 개수}로 나타낼 수 있지만 아직 이해하지 못했다. 추가로 블로그에 기록할 것이다.

    댓글