상세 컨텐츠

본문 제목

[JS] 모의고사 - 프로그래머스

프로그래밍 및 언어/코딩 테스트 문제

by 남민우_ 2024. 11. 25. 21:01

본문

문제

입출력 예시

 

풀이

function solution(answers) {
    let answer = [];
    let supo1 = [1, 2, 3, 4, 5];
    let supo2 = [2, 1, 2, 3, 2, 4, 2, 5];
    let supo3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    let answerCount = [0, 0, 0];

    for (let i = 0; i < answers.length; i++) {
        if (answers[i] === supo1[i % supo1.length]) answerCount[0]++;
        if (answers[i] === supo2[i % supo2.length]) answerCount[1]++;
        if (answers[i] === supo3[i % supo3.length]) answerCount[2]++;
    }

    let max = Math.max(...answerCount);
    for (let i = 0; i < answerCount.length; i++) {
        if (answerCount[i] === max) answer.push(i + 1);
    }
    return answer;
}

 

중고등 과정을 공부할 때 가장 많이 듣던 '문제 속에 답이 있다' 는 말이 코딩에서도 통할 줄은 몰랐다.

하지만 이 문제는 정말 문제 속에 답이 있다.

 

각자의 수포자가 문제를 찍는 방식을 살펴보면 일정한 패턴이 반복되고 있다.

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 가 계속 반복된다.

따라서 먼저 이 반복되는 패턴을 배열로 구현, 문제마다 반복되는 답을 입력할 수 있도록 하였다.

또한 answerCount 배열을 선언, 인자를 3개 넣어 수포자 각자의 경우에서 정답을 맞친 횟수를 카운트 할 수 있게 했다.

 

이후 반복문을 통해 answer 과 수포자의 답을 비교하는 과정을 거친다.

조건문을 통해 답이 맞는지 판단, 맞으면 해당 수포자의 정답 횟수를 ++ 시키는 과정인데, 생각해볼 포인트로는

supo1[i % supo1.length]

이 부분이 될 것이다.

문제는 제한 조건에 따라 최대 10,000 개까지 입력되지만 우리가 수포자들의 답안 패턴을 10,000개까지 입력할 수는 없다. 해서 반복되는 특성을 활용하기 위해 현재 인덱스 i 를 반복 패턴의 길이 supoN.length 로 나눈 나머지값을 활용하여 같은 패턴을 계속 반복 활용할 수 있도록 했다.

 

이 과정을 모두 거치고 나면 answerCount 에 각각의 정답 횟수가 입력된다.

예시로 주어진 1,2,3,4,5 를 예시로 하면 [3, 0, 0] 이 될 것이다.

 

먼저 제일 문제를 많이 맞춘 횟수를 구하기 위해 max 변수의 값을 구한다. 여기서 Math.max 메서드와 스프레드 기법이 활용되었다.

이후 answerCount의 길이, 즉 3명분치의 반복을 통해 문제를 맞춘 최대 횟수와 수포자 각각의 정답 횟수를 비교한다.

비교 후 조건이 성립하면 answer 에 해당 수포자의 인덱스 + 1 (수포자들의 번호는 1번부터 시작하기에 이를 맞추기 위함이다) 을 push 한다.

 

단순히 max의 인덱스를 구하면 되는거 아니야? 라고 생각할 수 있지만, 제한 조건을 잘 살펴보면 '가장 많은 문제를 맞춘 사람이 여럿일 경우' 라는 말이 있다.

단순히 한명만 구하는 문제가 아니라는 말이기에 애초에 주어진 answer 도 배열의 형태로 주어졌고, 모두가 동일한 횟수의 답을 맞춘 경우, 예시 2번의 경우도 생각을 해야 한다.

 

해서 이와 같은 반복문 과정을 거치고 난 후의 answer을 반환한다.

 

결과

예시 2번, 예시 1번 순으로 시행한 결과이다.

관련글 더보기