코드노트

프로그래머스 모의고사 문제풀이, 완전탐색 부분 본문

Code note/자바스크립트 알고리즘 문제풀이

프로그래머스 모의고사 문제풀이, 완전탐색 부분

코드노트 2022. 9. 2. 22:30

 

더보기

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

 

나의 풀이

function solution(answers) {
  const answer = [];
  const first_num = [1, 2, 3, 4, 5];
  const first_length = first_num.length;
  const second_num = [2, 1, 2, 3, 2, 4, 2, 5];
  const second_length = second_num.length;
  const third_num = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  const third_length = third_num.length;

  let correctCount = [0, 0, 0];

  for (let i = 0, len = answers.length; i < len; i++) {
    if (answers[i] === first_num[i % first_length]) correctCount[0] += 1;
    if (answers[i] === second_num[i % second_length]) correctCount[1] += 1;
    if (answers[i] === third_num[i % third_length]) correctCount[2] += 1;
  }

  const maxScore = Math.max(...correctCount);
  for (let i = 0; i < 3; i++) {
    if (correctCount[i] === maxScore) answer.push(i + 1);
  }

  return answer;
}

- 변수는 우선 수포자 3명의 답들을 배열로 변수를 만들었다.

- 카운트값을 넣을 수 있도록 하였는데 이건 정답들을 비교하면서 맞으면 1점씩 추가하도록 하였다.

그리고 length값을 통해서 i % 나머지로 반복을 시킬수있도록 하였다.

시험은 최대 10,000문제이기 때문이다.!

- maxScore에는 Math.max를 통해서 count값의 가장 높은 값을 넣어주었고, count배열중에서 max값들과 비교하며 추가하였다!

 

처음에는 count를 이용하지않고 filter를 통해서 맞는 값들을 구하였는데 테스트에서 몇개가 실패하였다...!count를 올리고 나중에는 Math.max를 이용하는게 키포인트였다...!

 

for를 안쓰고 filter만을 써서 사용하려고 했는데 filter를 변수마다 계속 사용하게 되면 그건 또 시간복잡도에있어서 좋지 않은 코드였다.. 참고해야겠다..!