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

이진규·2023년 3월 28일
0

모의고사

문제설명

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

문제풀이

수포자마다 같은 패턴을 반복합니다.

  const pattern1 = [1, 2, 3, 4, 5]
  const pattern2 = [2, 1, 2, 3, 2, 4, 2, 5]
  const pattern3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

정답 배열 answers를 돌면서 수포자의 정답과 비교해서 각 수포자의 정답개수를 파악합니다.
pattern을 계속 반복하기 위해서 answers의 index로 pattern의 index를 조정해줍니다.

  if(pattern[index % pattern.length] === answers[i]) answer1++

이를 반복해서 각 수포자의 정답 개수를 구하고 가장 많이 맞춘 수포자 번호를 담은 배열을 리턴합니다.
가장 많이 맞춘 수포자 번호를 구하기 위해 모든 경우의 수를 따져보았습니다.

  if(answer1 === answer2 && answer1 === answer3) return [1,2,3]
  if(answer1 > answer2 && answer1 > answer3) return [1]
  if(answer2 > answer1 && answer2 > answer3) return [2]
  if(answer3 > answer2 && answer3 > answer1) return [3]
  if(answer1 === answer2 && answer1 > answer3) return [1,2]
  if(answer2 === answer3 && answer2 > answer1) return [2,3]
  if(answer1 === answer3 && answer1 > answer2) return [1,3]

다른사람의 코드를 보고 배운 점

  • 너무 무식하게 모든 경우의 수를 계산해보았다. Math.max()를 통해 최댓값을 구하고 수포자의 정답 개수와 비교해서 배열에 넣으면 됐다.
  const maxAnswer = Math.max(answer1, answer2, answer3)
  if(maxAnswer === answer1) answer.push(1)
  if(maxAnswer === answer2) answer.push(2)
  if(maxAnswer === answer3) answer.push(3)
  return answer

출처

프로그래머스 최소직사각형 문제

소스코드

Github 소스코드

profile
개발자

0개의 댓글