코딩테스트

[프로그래머스 코딩테스트] 완전탐색 > 모의고사 (level 1)

보오 2021. 12. 26. 12:21

문제 보러 가기:

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr


나의 풀이: 

(1) 1, 2, 3번 학생의 답을 loop에 넣고 맞는지 틀린지 찾아서 점수를 매긴다. 페이지네이션 원리와 비슷하다. answers의 index을 각 학생의 점수의 길이로 나눈 나머지를 구한다. %을 사용
(2) scores라는 배열을 만들고 배열을 [n번 학생, n번 학생의 점수]로 만든다.
(3) scores을 좌표정렬 해준다. (점수 높은 순, 점수가 같으면 n의 오름차순)
(4) 최댓값을 구한다.
(5) 최댓값과 같거나 큰 경우에만 answers에 push해준다.

코드로 풀어보자면:

(1) 1, 2, 3번 학생의 답을 loop에 넣고 맞는지 틀린지 찾아서 점수를 매긴다. 페이지네이션 원리와 비슷하다. answers의 index을 각 학생의 점수의 길이로 나눈 나머지를 구한다. %을 사용

(2) scores라는 배열을 만들고 배열을 [n번 학생, n번 학생의 점수]로 만든다.

var scores = Array.from([1, 2, 3], x => [x++, 0]);
answers.forEach((e, i)=>{
    if(e===a[i%a_len]) scores[0][1]++;
    if(e===b[i%b_len]) scores[1][1]++;
    if(e===c[i%c_len]) scores[2][1]++;
})

(3) scores을 좌표정렬 해준다. (점수 높은 순, 점수가 같으면 n의 오름차순)

scores.sort((a, b) => {
    if (a[1] > b[1]) return b[1] - a[1];
    else if (a[1] === b[1]) return a[0] - b[0];
    else return b[1] - a[1];
});

 

(4) 최댓값을 구한다.
(5) 최댓값과 같거나 큰 경우에만 answers에 push해준다.

var max = scores[0][1];
    scores.forEach(([p, s]) => {
    if (s === max) answer.push(p);
});

<최종코드>

function solution(answers) {
  var answer = [];
  var scores = Array.from([1, 2, 3], (x) => [x++, 0]);
  var a = [1, 2, 3, 4, 5];
  var a_len = a.length;
  var b = [2, 1, 2, 3, 2, 4, 2, 5];
  var b_len = b.length;
  var c = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  var c_len = c.length;
  answers.forEach((e, i) => {
    if (e === a[i % a_len]) scores[0][1]++;
    if (e === b[i % b_len]) scores[1][1]++;
    if (e === c[i % c_len]) scores[2][1]++;
  });
  scores.sort((a, b) => {
    if (a[1] > b[1]) return b[1] - a[1];
    else if (a[1] === b[1]) return a[0] - b[0];
    else return b[1] - a[1];
  });
  var max = scores[0][1];
  scores.forEach(([p, s]) => {
    if (s === max) answer.push(p);
  });
  return answer;
}