TIL 65 day 프로그래머스

Winney·2021년 1월 15일
0
post-thumbnail

모의고사

수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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,4,5] => [1],
    [1,3,2,4,2] => [1,2,3]
function solution(answers) {
  const answer = [];
  const firstStudent = [1,2,3,4,5];
  const secondStudent = [2,1,2,3,2,4,2,5];
  const thirdStudent = [3,3,1,1,2,2,4,4,5,5];
  
  const firstStudentAnswerCount = answers.filter((answer, index) =>
	answer === firstStudent[index % firstStudent.length]).length
  const secondStudentAnswerCount = answers.filter((answer, index) => 
  	answer === secondStudent[index % secondStudent.length]).length
  const thirdStudentAnswerCount = answers.filter((answer, index) => 
 	answer === thirdStudent[index % thirdStudent.length]).length
     
const maxArr = [firstStudentAnswerCount,secondStudentAnswerCount,thirdStudentAnswerCount]

  for(let i =0 ; i < maxArr.length; i++) {
    const max = Math.max (firstStudentAnswerCount,secondStudentAnswerCount,thirdStudentAnswerCount)
    if (maxArr[i] >= max) {
      answer.push(i+1)
    }
  }  

  return answer;
}
  1. 각 학생이 답을 찍는 패턴을 배열로 만든다.
  2. 각 학생들이 맞춘 답의 개수를 찾는다. (filter 사용)
  3. 학생들이 맞출 답의 개수를 배열에 담는다.(maxArr)
  4. 맞춘 답 중 가장 큰 수를 찾는다. (max)
  5. for문으로 가장 많이 맞춘 답의 개수(max)와 각 학생이 맞춘 답의 개수를 비교해 해당 학생의 번호(i+1)을 answer 배열에 넣는다.

이번에 가장 막혔던 부분은 answers의 길이가 학생의 답 패턴 배열보다 무조건 긴데 이걸 어떻게 answers 끝까지 비교할 것인가였다.
원래는 Math.ceil(answers.length/studentAnswer.length)를 해서 나온 값을 studentAnswer에 붙여서 for문을 할까라고 막연히 생각하다가 실현하기 힘들다는 생각이 들어서 포기했다.

계속 아이디어가 생각이 안 나서 결국 찾아봤는데 나머지 값을 구해서 반복적으로 answer를 비교하는 방법이 있었다. 역시 사람들이 똑똑하다...

그 이후로는 문제 풀이가 매끄럽게 흘러갔다.

마지막의 for문의 경우 지금은 학생 수가 3명이고 문제 자체도 3명으로 고정되어 있지만 학생이 늘어난다면 for문이 더 맞지 않을까해서 for문을 사용하게 되었다.

전체적으로 학생 수가 늘어날 경우를 감안해서 작성한 코드는 아니지만 만약에 학생 수도 늘어난다면 많은 부분을 고쳐야 할 것 같다. filter도 지금처럼 사용하기는 힘들겠고 maxArr도 지금처럼 직접 요소를 주는게 아닌 Array.push를 써야겠다.

프로그래머스 분류에 완전탐색이라고 되어 있던데 조만간 완전탐색에 대해 알아봐야겠다.

profile
프론트엔드 엔지니어

0개의 댓글