[프로그래머스] JS - 모의고사(완전탐색)

sarang_daddy·2023년 2월 1일
0

문제

프로그래머스 모의고사
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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) {
  var answer = [];
  const score = [];

  const student1 = [1, 2, 3, 4, 5];
  const student2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const student3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  // 맞힌 수를 카운트 해주는 함수
  const countAnswer = (studentAnswer) => {
    let checkAnswer = [...answers]; // 정답들의 배열
    let count = 0;

    while (checkAnswer.length !== 0) { // 모든 정답을 탐색할때까지
      // 학생들의 답이 5, 8, 10의 루트를 가지고 있기에 각 루트만큼 정답에서 잘라오고
      const checkRange = checkAnswer.slice(0, studentAnswer.length);
      
	  // 가져온 정답과 학생의 답이 일치하면 filter를 새로운 배열로 만들어주는 함수
      const isSameValue = (checkRange, studentAnswer) =>
        checkRange.filter((v, i) => v === studentAnswer[i]);
      
      const countArray = isSameValue(checkRange, studentAnswer);
      count += countArray.length; // 일치한 정답들의 배열길이가 맞힌 수다.
      checkAnswer.splice(0, studentAnswer.length); // 확인된 정답은 제거한다.
    }
    return count;
  };

  score.push(countAnswer(student1));
  score.push(countAnswer(student2));
  score.push(countAnswer(student3));

  // 각 학생들의 맞힌 수 카운트 중 가장 많이 맞힌 학생을 반환한다.
  score.forEach((v, i) => {
    let maxValue = Math.max(...score);
    if (v === maxValue) {
      answer.push(i + 1);
    }
  });

  return answer;
}

다른 사람 풀이

function solution(answers) {
    var answer = [];
    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;
    var max = Math.max(a1c,a2c,a3c);

    if (a1c === max) {answer.push(1)};
    if (a2c === max) {answer.push(2)};
    if (a3c === max) {answer.push(3)};


    return answer;
}

학생들의 답변이 가지고 있는 루틴 5, 8, 10을 index % length(루틴)로 생각해내는게 포인트였다.
루틴까지는 생각했지만, 배열의 slice가 아닌 수학적으로 접근한 방법이 간결한 코드를 만들어 냈다.

profile
한 발자국, 한 걸음 느리더라도 하루하루 발전하는 삶을 살자.

0개의 댓글