본문 바로가기
문제풀이/프로그래머스

모의고사

by dev_kong 2021. 12. 28.
728x90
728x90

문제 설명

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

접근방법

1번 , 2번 ,3번 학생 모두 일정한 패턴을 가지고 답을 찍는다.

% remainder 연산자를 이용하면 될 거 같았다.

예를 들어 1번 학생의 패턴은 1,2,3,4,5 총 다섯개로 이루어져 있다.

만약 1번 문제의 답과 1번 학생의 1번 문제의 답을 비교하고 싶으면 

1을 5로 나눈 나머지인 1,

이 나머지를 1번 학생의 답안에 대입해보면 된다.

입력이 [1, 2, 3, 4, 5 ,1] 이고, 6번문제를 비교 하고 싶으면,

6을 5로 나눈 나머지인 1,

1번학생의 패턴에서 1번은 1 이다.

답과 일치하는 것을 확인할 수 있다.

 

function solution(answers) {
  const answer = [];
  const studentA = [1, 2, 3, 4, 5];
  const studentB = [2, 1, 2, 3, 2, 4, 2, 5];
  const studentC = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  const score = [0, 0, 0];

  for (let i = 0; i < answers.length; i++) {
    const j = i % studentA.length;
    const k = i % studentB.length;
    const s = i % studentC.length;
    if (studentA[j] === answers[i]) score[0] += 1;
    if (studentB[k] === answers[i]) score[1] += 1;
    if (studentC[s] === answers[i]) score[2] += 1;
  }

  const highScore = Math.max(score[0], score[1], score[2]);
  for (let i = 0; i < score.length; i++) {
    if (score[i] === highScore) answer.push(i + 1);
  }

  return answer;
}

쉬운 문제라 딱히 설명할 것도 없는거 같다...

 

function solution(answers) {
    var answer = [];
    var a1 = [1, 2, 3, 4, 5];
    var a2 = [2, 1, 2, 3, 2, 4, 2, 5]
    var a3 = [ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

    var a1c = answers.filter((a,i)=> a === a1[i%a1.length]).length;
    var a2c = answers.filter((a,i)=> a === a2[i%a2.length]).length;
    var a3c = answers.filter((a,i)=> a === a3[i%a3.length]).length;
    var max = Math.max(a1c,a2c,a3c);

    if (a1c === max) {answer.push(1)};
    if (a2c === max) {answer.push(2)};
    if (a3c === max) {answer.push(3)};


    return answer;
}

var가 좀 불편하긴한데...

filter를 사용한게 흥미롭다.

나는 전혀 생각지도 못했다.

다만, 조금 아쉬운 부분도 있는데, 마지막 if 3줄이 좀 맘에 걸린다.

사람이 3명이니까 세줄이지,

100명 1000명이라고 치면 100줄 1000줄이다.

배열로 만들어서 for문 돌리는게 더 낫지 않을까 싶다.

 

리프레쉬 할라고 푼 문젠데

내 학창시절이 떠올랐다.

난 항상 수학시험 시간에는 시간이 남아돌았다.

풀 수 있는 문제가 몇개 없었거든...

728x90
728x90

'문제풀이 > 프로그래머스' 카테고리의 다른 글

[Javascript]크레인 인형뽑기 게임  (0) 2022.01.04
[Javascript] 폰켓몬  (0) 2022.01.04
소수 만들기  (0) 2021.12.23
프린터  (0) 2021.11.29
기능개발  (0) 2021.11.27

댓글