수포자

YEONGHUN KO·2021년 11월 28일
0

ALGORITHMS - PRACTICE

목록 보기
21/50
post-thumbnail

1. 수포자

수포자들이 수학문제를 푼다. 사실 푼다기보다는 찍는다 ㅋㅋㅋㅋㅋ 근데 찍을때 각자의 규칙이 있다. 문제는 그 문제의 정답이 주어졌을 때 제일 문제를 많이 맞힌 학생이 누구인지 return하는 것이다. 만약 모두 점수가 같을때는 번호순서대로 push한다.

예를 들어 각 학생들의 찍는 패턴과 문제의 정답이 다음과 같다고 하자.

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];

let answer = [1, 3, 2, 4, 2];

이때 세학생 모두가 똑같이 2개를 맞추었으므로 최종 return 값은 [1,2,3] 이 되어야 한다.

2. 접근 방법

  • pseudo code

    • 완전탐색이므로, 한 문제 한 문제 맞았는지 틀렸는지 확인을 해야한다.
    • 한 문제를 탐색할때 1,2,3번 을 한 번에 체크 할 수 있는지 확인하라.
    • 최종적으로 누가 제일 많이 맞았는지 검사하라.

a1,a2,a3의 배열을 다 돌아야하나?? 또한 서로 규칙이 다른데 어떻게 정답과 비교하지? 이런 고민들이 들었다. 결국 방법을 찾아내지 못했고 답을 보았더니... 띠용! 역시나 배웠다 배우고 또 배우고 또 배운다. 정말 좋다. 새로운 접근법을 많이 배우고 시야가 트일 수 있어서.

function solution(answers) {
  let topStudent = [];
  let a1 = [1, 2, 3, 4, 5];
  let a2 = [2, 1, 2, 3, 2, 4, 2, 5];
  let a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  let alc = answers.filter((q, i) => q === a1[i % a1.length]).length;
  let a2c = answers.filter((q, i) => q === a2[i % a2.length]).length;
  let a3c = answers.filter((q, i) => q === a3[i % a3.length]).length;

  let top = Math.max(a1c, a2c, a3c);

  if (a1c === top) {
    topStudent.push(1);
  }
  if (a2c === top) {
    topStudent.push(2);
  }
  if (a3c === top) {
    topStudent.push(3);
  }

  return topStudent;
}

지금 다시 봐도 마음이 편안해질 정도의 깔끔함이 묻어난다. 이 코드의 핵심은 바로 필터안에서 각 학생들의 찍기 패턴을 loop하는 index 설정하는 방법이다. remainder를 통해서 arr안에 있는 원소를 반복 출력할 수 있을 줄은 꿈에도 몰랐다.

어떻게 이런 방법을 생각해 낼 수 있었을까? 검색? 문제의 시각화? 배움? 이런 적재적소의 방법을 찾아내는 능력을 어떻게 기를 수 있을지 생각해보자. 이게 그냥 많은 문제를 그냥 풀어보는 것보다 더 중요하지 않을까 싶다.

profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글