코딩 테스트

[프로그래머스 Level 1] 모의고사

y_flm 2025. 5. 1. 16:38
반응형
문제:
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.
수포자는 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하는 값을 오름차순 정렬해주세요.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

풀이보기
더보기
function score(userAnswers, answers) {
  let count = 0;

  for (let i = 0; i < answers.length; i++) {
    let index = i % userAnswers.length;
    if (answers[i] === userAnswers[index]) count++;
  }

  return count;
}

function solution(answers) {
  let student1 = [1, 2, 3, 4, 5];
  let student2 = [2, 1, 2, 3, 2, 4, 2, 5];
  let student3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  let corretCounts = [];

  corretCounts.push(score(student1, answers));
  corretCounts.push(score(student2, answers));
  corretCounts.push(score(student3, answers));

  let maxCount = Math.max(...corretCounts);
  let topScorers = [];

  for (let i = 0; i < corretCounts.length; i++) {
    if (maxCount === corretCounts[i]) topScorers.push(i + 1);
  }

  return topScorers;
}

 처음에는 반복되는 코드인 맞은 문제 수를 리턴해주는 score 함수를 따로 만들어서 풀었다.

학생마다 찍는 방식을 미리 선언해주고 score 함수를 통해 얻은 count를 correctCounts에 저장해준다.

그 후 correctCounts에서의 최댓값을 구해서 maxCount에 넣어주고,

문제를 많이 맞춘 학생의 번호를 topScores에 넣어줄 것이다.

그리고 maxCount와 correctCounts[i]가 같다면 topScore에 i + 1을 푸쉬하고,

마지막으로 topScores를 리턴해주면 된다.

 

그리고 다른 사람 풀이를 보다가 생각도 못했던 filter를 쓰는 방법도 있어서 filter로도 풀어봤다.

function solution(answers) {
    let student1 = [1, 2, 3, 4, 5];
    let student2 = [2, 1, 2, 3, 2, 4, 2, 5];
    let student3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    
    let correctCount1 = answers.filter((answer, i) => answer === student1[i % student1.length]).length;
    let correctCount2 = answers.filter((answer, i) => answer === student2[i % student2.length]).length;
    let correctCount3 = answers.filter((answer, i) => answer === student3[i % student3.length]).length;
    
    let maxCount = Math.max(correctCount1, correctCount2, correctCount3);
    let result = [];
    
    if(maxCount === correctCount1) result.push(1);
    if(maxCount === correctCount2) result.push(2);
    if(maxCount === correctCount3) result.push(3);
    
    return result;
}

이 문제는 다양하게 풀이할 수 있어서 좋은 것 같다!

 

반응형