[JavaScript] 프로그래머스 모의고사 풀이

송히·2024년 3월 27일
0
post-thumbnail

🔍 완전탐색 > 모의고사

클릭해서 문제 전체 보기🔼

📖 풀이 코드

// 1번: 1 2 3 4 5
// 2번: 2 1 2 3 2 4 2 5
// 3번: 3 3 1 1 2 2 4 4 5 5

function solution(answers) {
    let num1Arr = [1,2,3,4,5];
    let num2Arr = [2,1,2,3,2,4,2,5];
    let num3Arr = [3,3,1,1,2,2,4,4,5,5];
    let scoreMap = new Map();
    let result = [];
    
    for(i=0; i<3; i++) {
        scoreMap.set(i+1, 0);
    }
    
    answers.forEach(ele => {
        let num1 = num1Arr.shift();
        let num2 = num2Arr.shift();
        let num3 = num3Arr.shift();
        
        if(ele == num1) scoreMap.set(1, scoreMap.get(1)+1);
        if(ele == num2) scoreMap.set(2, scoreMap.get(2)+1);
        if(ele == num3) scoreMap.set(3, scoreMap.get(3)+1);
        
        num1Arr.push(num1);
        num2Arr.push(num2);
        num3Arr.push(num3);
    })
    let scoreArr = [...scoreMap].sort((a, b) => b[1] - a[1]);
    
    if(scoreArr[0][1] > scoreArr[1][1]) return [scoreArr[0][0]];
    else if(scoreArr[1][1] > scoreArr[2][1]) {
        result.push(scoreArr[0][0], scoreArr[1][0]);
        return result;
    } else {
        result.push(scoreArr[0][0], scoreArr[1][0], scoreArr[2][0]);
        return result;
    }
    
}

📢 풀이 설명
이 문제를 풀면서 2가지에 대해 고민했다.

1. 수포자마다 찍는 패턴의 개수가 각자 다른데, 이걸 어떻게 한꺼번에 사용해야할까?
2. 코드도 너무 길고, 반복되는 코드가 너무 많아 효율적이지 않은 것 같다.

나는 1번을 맨 앞 요소를 shift해서 맨 뒤에 갖다붙이는 식으로 해결했다. 찍은 답의 배열을 계속 유지시키는 방법이었다.
다른 사람의 풀이에서 발견한 방법으로는 answer의 idx % [찍은 배열 길이]이 있었다. 이 방법을 사용하면 shift + push 과정이 없어서 더 효율적이었다.

또, 나는 if를 사용해 하나하나 비교했는데 이 방법 대신 filter를 사용해 일치하는 것만 골라내니까 코드가 훨씬 간결해졌다.

2번의 문제는 1번의 해결법 + 가장 큰 값 비교방식을 바꾸면 해결된다.
가장 큰 값을 하나하나 비교하지말고, Math.max()로 값 뽑은 뒤 수포자 1번부터 맞은 개수와 Math.max()를 비교해서 일치하면 추가하면 된다.

JS의 메서드들을 잘 쓰면 코드의 가독성과 효율성이 올라감을 느꼈다. 메서드 익히기는 정말 중요해..

profile
데브코스 프론트엔드 5기

0개의 댓글

관련 채용 정보