코딩테스트 입문

모의고사

강민승 2022. 11. 23. 22:45

문제

 

 

 

 

나의 풀이

 

첫번째시도

// 받은 문제와 수포자들이 찍는 방식을 비교한다. 순회예정
// 수포자들의 찍는 방법들을 배열로 묶어 하나의 배열안에 다 넣는다.[[1번 방식],[2번방식],[3번방식]]
// 이중 for문을 통해서 answers를 순회하여 정답 수를 count 한 후 새로운 배열 [0,0,0]을 카운트한다.
// 마지막 카운트 숫자를 비교하여 max순번의 인덱스를 리턴할 예정.
// 학창시절 연필 굴릴때가 생각나버렸다. 수포자의 삶이란

function solution(answers) {
    let count = [0, 0, 0];
    let answer = [];
    let choice_array = [
      [1, 2, 3, 4, 5, 1, 2, 3, 4, 5], // 1번 수포자
      [2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5], //2번 수포자
      [3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5], //3번 수포자
    ];
    for (let i = 0; i < 3; i++) {
      for (let j = 0; j < answers.length; j++) {
        choice_array[i][j] == answers[j] ? count[i]++ : "";
       
      }
    }
  
    count.map((data, idx, array) => {
      data == Math.max.apply(null, count) ? answer.push(idx + 1) : "";
  
    });
  
    return answer;
  }

첫번째 시도에서는 코드 실행에는 통과하였으나 채점에서 몇몇 문제가 통과되지 않아 많이 혼란을 겪었던 것 같다.

키포인트는 choice_array의 i번째 배열의 j번째 값이 answers배열의 j의 값과 같으면 count의 i번째 카운트를 주는 방식 

for문이 다 돌고난 후는 카운트가 이미 끝난시점이기때문에 count배열에서 map함수를 사용하여 각각 첫번째,두번째,세번째 data가 최대값과 같을때 answer에 추가한다. 최대값이 유일한 값이 존재하면 그 값만들어가고 최대값이 동일한 값이 존재하면 각각의 데이터의 인덱스에 맞게 들어간다.

 

과연 어떤 것이 문제인가에 대해서 많은 시간동안 헤메고 고민하던 와중에 찾은 글. 

'answer배열의 길이가 수포자들의 배열의 길이보다 길면 수포자들의 i번째 길이를 구하는게 아니다. 그냥 i번째를 구하는거지'

이게 도대체 무슨 뜻일까..  또 고민고민.. 결국 해결한 방법으로 다시 작성한 코드.

 

두번째 시도

function solution(answers) {
  let count = [0, 0, 0];
  let answer = [];
  let choice_array = [
    [1, 2, 3, 4, 5], // 1번 수포자
    [2, 1, 2, 3, 2, 4, 2, 5], //2번 수포자
    [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], //3번 수포자
  ];
  for (let i = 0; i < 3; i++) {
    
    for (let j = 0; j < answers.length; j++) {
      choice_array[i][j % choice_array[i].length] == answers[j]
        ? count[i]++
        : "";
    }
  }

  count.map((data, idx, array) => {
    data == Math.max.apply(null, count) ? answer.push(idx + 1) : "";
    
  });

  return answer;
}

 

크게 바뀐 코드는 없지만 for문 안에 choice_array와 answer의 데이터가 같게하기 위해서 수정을 할 수 밖에 없었다.

answer의 답안들이 예를들어 100개가 넘는다고하면 기존의 코드로는 데이터를 구할 수 없다. 

 choice_array[i][j] 이라는 코드에 j가 100이들어가게 될텐데 choice_array의 배열길이는 100개가 되지않기 때문.

그렇기 때문에 answer 답안의 길이에 맞게 비교를 해주어야 한다.

계속해서 순환해야하는건 choice_array의 i번째.

j의 리스트들을 choice_array[i] 번째의 길이로 나눈 나머지의 인덱스로 answer의 j번째와 비교하여 구해야 한다.

( choice_array[i][j % choice_array[i].length] )