모의고사

📔 문제 설명

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

📓 제약 조건

📓 입출력의 예

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

❗ 1번째

1번 수포자의 방식은 1~5까지 반복되는 숫자를 정답으로 찍고있다
2번 수포자의 방식같은 경우에 2, 1, 2, 3, 2, 4, 2, 5후에 다시 반복된다
3번 수포자의 방식경우에 3, 3, 1, 1, 2, 2, 4, 4, 5, 5,후에 다시 반복된다
즉 배열을 저기에 통과해서 맞추는 통과 숫자를 리턴하면된다

첫번째로 한일은 수포자의 패턴을 선언하는것이다 나는 오브젝트 형태로 했지만 배열로 해도됐을거같다.
두번째는 점수들의 모음을 배열로 선언하여 만들었다

첫번째 로직은 모든 수포자가 패턴을 검사하여 정답일시 점수모임에 값을 더하는 로직이다

두번째 로직은 처음엔 reduce나 filter를 이용하여 math.max를 쓰지않고 해볼려했지만 이 방법이 더 보기 편하고 직관적이라 for문을 사용하여 작성하여 가장큰숫자를 가진 인덱스를 찾는 작업을 실행했다

✅ 실행 코드

function solution(arr) {
  const 수포자패턴 = {
    0: [1, 2, 3, 4, 5],
    1: [2, 1, 2, 3, 2, 4, 2, 5],
    2: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
  };

  let 점수모음 = [0, 0, 0];
  let result = [];

  for (let i = 0; i < 3; i++) {  // 1 번째 로직 
    const 패턴 = 수포자패턴[i];
    const 패턴길이 = 패턴.length;

    for (let j = 0; j < arr.length; j++) {
      if (arr[j] === 패턴[j % 패턴길이]) {
        점수모음[i] += 1;
      }
    }
  }

  const 가장큰숫자 = Math.max(...점수모음);

  for (let i = 0; i < 점수모음.length; i++) { // 2번째 로직
    if (가장큰숫자 === 점수모음[i]) {
      result.push(i + 1);
    }
  }

  return result;
}

📚 문제 느낀점

어떻게 사고를 해야되는지 고민을 해야되는문제 크게 어렵진 않았다.


© 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/42840