far

[JS 알고리즘] 학급 회장(해쉬) 본문

알고리즘/알고리즘 베이스

[JS 알고리즘] 학급 회장(해쉬)

Eater 2023. 3. 28. 21:14

학급 회장

학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다.

투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다.

선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요. 반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다.

 

입력설명 

첫 줄에는 반 학생수 N(5<=N<=50)이 주어집니다. 

두 번째 줄에 N개의 투표용지에 쓰여져 있던 각 후보의 기호가 선생님이 발표한 순서대로 문자열로 입력됩니다.

 

출력설명

학급 회장으로 선택된 기호를 출력합니다.

 

입력예제

15

BACBACCACCBDEDE

 

출력예제

C

 

// 나의 풀이

// 1번 방법

function solution(s){
    let answer = "";
    let student = []
    let sum = 0

    for (let i = 0; i < s.length; i++) {
        if(!student.includes(s[i])) {
            student.push(s[i])
        }
    }

    for (let i = 0; i < student.length; i++) {
        let tmp = 0
        for (let j = 0; j < s.length; j++) {
            if (student[i] === s[j]) {
                tmp++
            }
        }
        if (tmp > sum) {
            sum = tmp
            answer = student[i]
        }
    }
}

let str="BACBACCACCBDEDE";
console.log(solution(str));

// 2번 방법 (해쉬)
// 강의의 풀이와 같다
function solution(s){
    let answer = "";
    const student = new Map()
    let max = 0;

    for(let i of s) {
        if (student.has(i)) {
            student.set(i, student.get(i)+1)
        } else if(!student.has(i)) {
            student.set(i, 1)
        }
    }

    for (let [key, value] of student) {
        if (max < value) {
            max = value
            answer = key
        }
    }

    return answer;
}

let str="BACBACCACCBDEDE";
console.log(solution(str));

이번 문제는 해쉬를 배우는 문제였기에 일단 강의 보기 전에 풀 수 있는 방법(1번)으로 풀어봤다. student배열 안에 중복 안되게 하나씩 값을 넣고 이중 for문을 돌려서 카운트를 하고 max값을 비교하는 방법을 사용했다.

그리고 강의의 개념을 보고 2번 풀이처럼 풀어봤다. new Map을 만들어 i가 있으면 +1 없으면 생성을 해서 끝나면, 다시 한 번 for ... of 문법으로 key값과 value값을 꺼내 계산을 해주었다. 이렇게 푸니까 for문도 하나 줄고 식도 간결해졌다.

 

[key, value] of 를 사용하면 key값과 value값이 동시에 하나씩 꺼내지는건 처음 알았다.

 

 

 

출처:

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4#curriculum

Comments