Level 1) 모의고사 ⭐️

Doozuu·2023년 2월 22일
0

프로그래머스 (JS)

목록 보기
63/183

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

answers		return
[1,2,3,4,5]	[1]
[1,3,2,4,2]	[1,2,3]

입출력 예 설명

입출력 예 #1

수포자 1은 모든 문제를 맞혔습니다.
수포자 2는 모든 문제를 틀렸습니다.
수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

모든 사람이 2문제씩을 맞췄습니다.


풀이

  1. 각 사람마다 문제를 푸는 패턴을 파악한다.
    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 반복

  2. 각 사람의 점수를 나타내는 배열 score과, 가장 많이 맞힌 사람을 담을 배열 answer을 만든다.

  3. 반복문을 이용해 각자의 점수를 score에 담아준다.
    이때, 문제 answers의 길이가 패턴의 길이를 넘어도 패턴을 반복하여 비교할 수 있도록 i에서 각 패턴의 길이를 나눈 나머지를 이용해준다.
    (패턴의 길이가 길지 않아서 직접 셌지만, length를 이용해서 구해도 된다.)

  4. 최고점을 받은 사람이 중복되면 중복된 사람들을 모두 반환해야 하므로, 점수를 mapping해서 최고점과 일치하면 answer에 index+1을 담아준다.
    (실제 번호가 index보다 1씩 작으므로 1을 더해준다.)
    원래는 최고점의 index를 찾아서 구하려고 했으나 index를 모두 찾는게 번거롭기도 하고, score의 갯수가 3개밖에 없어서 mapping을 하는게 더 간단하겠다고 판단했다.

생각해야할 포인트들이 많았지만 혼자 잘 풀었다!! 😎

function solution(answers) {
    let fir = [1,2,3,4,5];
    let sec = [2,1,2,3,2,4,2,5];
    let thr = [3,3,1,1,2,2,4,4,5,5];
    let score = [0,0,0];
    let answer = [];
  
    for(let i=0;i<answers.length;i++){
        if(answers[i] == fir[i%5]) score[0]++;
        if(answers[i] == sec[i%8]) score[1]++;
        if(answers[i] == thr[i%10]) score[2]++;
    }
    score.map((n,i) => n === Math.max(...score) ? answer.push(i+1) : "");
    return answer;
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글