프로그래머스/Lv1

[프로그래머스/Javascript] Lv.1 모의고사

woo.oing 2026. 1. 15. 11:10
 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

✓ 풀이과정

 

처음 시도했던 풀이과정은 다음과 같습니다

 

1. 수포자별로 찍는 방식에 따라 문제 정답을 문제 길이만큼 반복해서 개별로 저장

2. 문제를 순회하며 수포자 개별 정답 개수 체크

3. 가장 높은 정답 개수를 찾고, 해당 정답 개수와 동일하게 맞은 수포자를 최종 결과 배열에 저장

 

function solution(answers) {
  let answer = [];
  let score = new Map([
    [1, 0],
    [2, 0],
    [3, 0],
  ]);
  let maxScore = 0;

  let firstPattern = [1, 2, 3, 4, 5];
  let firstAnswer = new Map();

  let secondPattern = [2, 1, 2, 3, 2, 4, 2, 5];
  let secondAnswer = new Map();

  let thridPattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  let thridAnswer = new Map();

  const getAnswer = (answer, pattern) => {
    for (let i = 0; i < answers.length; i++) {
      answer.set(i, pattern[i % pattern.length]);
    }
  };

  getAnswer(firstAnswer, firstPattern);
  getAnswer(secondAnswer, secondPattern);
  getAnswer(thridAnswer, thridPattern);

  for (let i = 0; i < answers.length; i++) {
    const answer = answers[i];
    if (firstAnswer.get(i) === answer) score.set(1, score.get(1) + 1);
    if (secondAnswer.get(i) === answer) score.set(2, score.get(2) + 1);
    if (thridAnswer.get(i) === answer) score.set(3, score.get(3) + 1);
  }

  for (const [key, value] of score) {
    if (maxScore < value) maxScore = value;
  }

  for (const [key, value] of score) {
    if (maxScore === value) answer.push(key);
  }

  return answer;
}

 

 

정답은 통과했으나 한눈에 봐도 개선할 수 있을 것 같은 반복/불필요한 부분이 보였습니다

불필요하게 두 번에 나눠서 정답 항목 배열을 생성하고, 다시 하나씩 체크할 필요없이 한번에 확인하도록 할 수 있었습니다

 

또한 최대값을 구하는 부분에서도 Math.max로 간단하게 변경하고 복잡성만 추가되는 불필요한 Map 사용을 배열로 변경했습니다

→ 점수계산, 최대값 산정, 불필요한 Map 사용 개선

 

function solution(answers) {
  let answer = [];
  let maxScore = 0;
  let score = [0, 0, 0];

  let firstPattern = [1, 2, 3, 4, 5];
  let secondPattern = [2, 1, 2, 3, 2, 4, 2, 5];
  let thridPattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  for (let i = 0; i < answers.length; i++) {
    const answer = answers[i];

    if (firstPattern[i % firstPattern.length] === answer) score[0]++;
    if (secondPattern[i % secondPattern.length] === answer) score[1]++;
    if (thridPattern[i % thridPattern.length] === answer) score[2]++;
  }

  maxScore = Math.max(...score);

  for (let i = 0; i < score.length; i++) {
    if (maxScore === score[i]) answer.push(i + 1);
  }

  return answer;
}

 

 

여기서도 생각해보면 세 번 반복되는 부분이 있고, 수포자의 수가 3명이 아니라 더 늘어난다면 추가될 코드가 보입니다

만약 한 명의 수포자 패턴이 추가된다면 간단하게 추가해도 동작할 수 있는 코드로 추가 수정했습니다

→ 수포자별 반복 계산 개선

 

 

✓ 최종코드

function solution(answers) {
  let answer = [];
  let patterns = [
    [1, 2, 3, 4, 5],
    [2, 1, 2, 3, 2, 4, 2, 5],
    [3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
  ];
  let score = Array(patterns.length).fill(0);

  for (let i = 0; i < answers.length; i++) {
    for (let j = 0; j < patterns.length; j++) {
      if (patterns[j][i % patterns[j].length] === answers[i]) score[j]++;
    }
  }

  let maxScore = Math.max(...score);

  for (let i = 0; i < score.length; i++) {
    if (maxScore === score[i]) answer.push(i + 1);
  }

  return answer;
}

 

 

한번 틀을 잡아두고 나서 리팩토링 하면서 코드 줄여나가고 더 좋은 방법을 찾는 것도 재미있는 과정이었습니다!