[ 08.03 ] 모의고사

이숙영·2021년 8월 3일
0

알고리즘

목록 보기
11/17
post-thumbnail

🧠 문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
입출력 예

answers	      return
[1,2,3,4,5]	[1]
[1,3,2,4,2]	[1,2,3]

입출력 예 설명
입출력 예 #1
수포자 1은 모든 문제를 맞혔습니다.
수포자 2는 모든 문제를 틀렸습니다.
수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
모든 사람이 2문제씩을 맞췄습니다.

👀 문제에 대한 이해

세명으로 딱 정해져있어서 세명에 대한 변수를 직접 지정하도록 한다.
(처음엔 저게 무슨규칙인고.. 하고 봤는데 정해진 규칙은 없고 그냥 쟤네는 지네만의 규칙으로 저렇게 찍는거였다.)
총 문제가 담겨있는 매개변수, answers 를 다 돌면서
각 학생이 찍은 수가 answers[i] 번째와 같을때 ,
각 학생이 찍는 배열의 요소가 answers와 제일많이 겹치는 학생을 배열형태로 리턴해주면 된다.
각 학생들은 자신들만의 규칙으로 찍는 방식을 문제수 만큼 계속 반복한다.
예를들어 1,2,3,4,5 의 방식으로 찍고 문제수가 11문제라면
1,2,3,4,5 ,1,2,3,4,5 1
11번째 문제는 1로찍는다는 말이다.
이러한 방식으로 제일 잘찍은 학생 배열형태로 리턴해야 한다.
만약 찍은수가 똑같이 맞았다면 오름차순으로 리턴하면 된다.

👀 수도코드

  1. 세명의 학생이 찍는 방식으로 배열형태로 변수에 담아준다.
  2. 맞았을때 점수를 카운트 해줄 변수 countArr 를 생성한다.
  3. 총 세명이므로 countArr = [0,0,0] 로 기본세팅해준다.
  4. 각 학생들은 찍는 방식을 반복해서 사용하기 때문에 반복문
    -> student[문제의i번째 % student.length] 이 방식을 이용하면 제아무리 문제가 많다 해도 student의 배열길이만큼 나눈수의 나머지값의 인덱스를 나타내기 때문에 간단하게 이렇게 사용해도 된다!
  5. answers[i] 와 student[문제의i번째 % student.length] 가 같으면 countArr[0 || 1 || 2]번째에 1씩 더해주며 카운팅 한다.
  6. countArr 에서 가장 큰 수를 추출한다.
  7. 만약 동점자가 있을 경우에는 i+1로 직접 오름차순으로 정렬을 구현한다.

👀 풀이

function solution(answers) {
    let answer = [];
    //answers = [1,3,2,4,2]	
    //수포자 3인방(이숙영포함)
    //answers.length 도달할때까지 각 수포자들은
    let student1 = [1,2,3,4,5];
    let student2 = [2,1,2,3,2,4,2,5];
    let student3 = [3,3,1,1,2,2,4,4,5,5];
    let countArr = [0, 0, 0];
    //answers 만큼 돌고 i 번째가 student1,2,3[i] 번째 요소와 같으면
    //countArr[0,1,2] 번 각각 1 씩 카운트
    
  for(let i = 0; i < answers.length; i++){
    if(answers[i] === student1[i % student1.length]){ 
        countArr[0]++; 
    }
    if(answers[i] === student2[i % student2.length]){ 
        countArr[1]++; 
    }
    if(answers[i] === student3[i % student3.length]){ 
        countArr[2]++; 
    }
  }

  const max = Math.max(...countArr); 
  for(let i = 0; i < countArr.length; i++){
    if(countArr[i] === max){ //동점자가 있을 경우, 오름차순으로 정렬
      answer.push(i + 1); 
    }
  }
  return answer;
}
profile
FrontEndDeveloper

0개의 댓글