[프로그래머스] Level 1 - 모의고사 (JavaScript)

구미·2021년 6월 28일
0

알고리즘

목록 보기
14/25

제출한 코드

function solution(answers) {
    const bestSupo = [];
    let grade1 = 0;
    let grade2 = 0;
    let grade3 = 0;
    
    const n = answers.length;
    
    for (let i = 0; i < n; i++) {
      let answer = answers[i];

      // i번 문제에 대한 수포자들의 답
      let supo1 = [1, 2, 3, 4, 5][i % 5];
      let supo2 = [2, 1, 2, 3, 2, 4, 2, 5][i % 8];
      let supo3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5][i % 10];

      if (supo1 === answer) grade1++;
      if (supo2 === answer) grade2++;
      if (supo3 === answer) grade3++;
    }
    
    const bestResult = Math.max(grade1, grade2, grade3);
    if (grade1 === bestResult) bestSupo.push(1);
    if (grade2 === bestResult) bestSupo.push(2);
    if (grade3 === bestResult) bestSupo.push(3);
    
    
    return bestSupo;
}

나머지를 이용해서 문제에 대한 각 수포자들의 답안을 구했는데, 뭔가 깔끔한 느낌이 없는 듯해서... 다른 풀이를 참고해봤다.

참고한 풀이

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;

각 수포자들의 답안 패턴 배열을 변수로 선언해준 것까지는 동일한데, filter 메소드를 사용한 점이 특징적이었다.

  1. filter를 사용해 a1c, a2c, a3c 변수에 각 수포자들이 맞힌 문제(의 답안)만을 새로운 배열로 반환
  2. .length를 통해 맞힌 문제의 개수를 셈

이후로 Math.max를 이용한 것 등은 내 풀이와 비슷했다.

기타

위 풀이에 대한 댓글에 어떤 분이 answers 배열을 세 번에 나눠서 탐색하기 때문에 성능 이슈가 발생할 수 있을 것 같다는 말씀을 하셨다.
그냥 궁금해서 시간을 비교해봤는데, 거의 모든 테스트 케이스에서 내 풀이처럼 for문을 한 번 도는 게 더 빨랐지만 9, 11, 12, 14번 케이스 같은 경우에는 내 풀이가 눈에 띄게 오래 걸려서... 뭐가 문제일까 궁금했다 🤔

추가로 풀이 마지막에 세 수포자의 점수를 비교해서 배열에 push하는 부분에 반복문을 사용하는 게 좋을 것 같다는 의견이 있었다. 그렇게 안 쓰긴 했지만 완전 동의! 🙆🏻‍♀️

문제 출처

https://programmers.co.kr/learn/courses/30/lessons/42840?language=javascript

profile
디지털 노마드를 꿈꾸며! 🦄 🌈

0개의 댓글