Algorithm - lev1 모의고사

ryan·2022년 5월 23일
0

프로그래머스 level1 모의고사

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 함수를 작성해주세요.

내 풀이 (100/100)

function solution(answers) {
  let oneRef = [1, 2, 3, 4, 5];
  let twoRef = [2, 1, 2, 3, 2, 4, 2, 5];
  let threeRef = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  let count = [0, 0, 0];
  let answer = [];
  answers.forEach((e, i) => {
    if (e === oneRef[i % 5]) {
      count[0] += 1;
    }
    if (e === twoRef[i % 8]) {
      count[1] += 1;
    }
    if (e === threeRef[i % 10]) {
      count[2] += 1;
    }
  });
  
  // 가장 많이 맞춘 사람 
  let compare = Math.max(...count);
  for (let i = 0; i < 3; i++) {
    if (count[i] === compare) {
      answer.push(i + 1);
    }
  }
  return answer;
}
  • 처음에 제출했을 때 일부 테스트케이스에서 계속 실패가 나왔다. 원인을 찾을수가 없어서 풀이를 봤는데, 뭐가 틀렸는지 바로 알 수 있었다.

풀이 보기

function solution(answers) {
  const answer = [];
  const firstPattern = [1, 2, 3, 4, 5];
  const firstPLength = firstPattern.length;
  const secondPattern = [2, 1, 2, 3, 2, 4, 2, 5];
  const secondPLength = secondPattern.length;
  const thirdPattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  const thirdLength = thirdPattern.length;
  let correctCount = [0, 0, 0];

  for (let i = 0, len = answers.length; i < len; i++) {
    if (answers[i] === firstPattern[i % firstPLength]) correctCount[0] += 1;
    if (answers[i] === secondPattern[i % secondPLength]) correctCount[1] += 1;
    if (answers[i] === thirdPattern[i % thirdLength]) 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;
}
  • 문제의 원인은 지문을 제대로 읽지 않은 탓이였다. 가장 많은 답을 맞춘 사람을 추출해야 하는데 답을 많이 맞춘 순서대로 추출하여 오답이 나왔었다. 문제는 천천히 제대로 읽어야 한다.
  • 이외의 접근 방식은 나와 동일하다.
profile
프론트엔드 개발자

0개의 댓글