본문 바로가기
코테연습

54. 모의고사 Javascript

by hxunz 2022. 5. 29.

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

 

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

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

programmers.co.kr

 

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 수포자 세명이 문제를 찍어서 풀었는데 누가 제일 많이 맞췄을까?
  • 주어진 자료는 무엇인가?
     - 정답이 들어있는 배열 answers
     - 수포자가 찍는 방식
     - 수포자1 : 12345 반복
     - 수포자2 : 21232425 반복
     - 수포자3 : 3311224455 반복
  • 조건은 무엇인가?
     - 수포자는 세명이다 
     - 수포자들은 특정 숫자들을 반복하면서 찍는다
 
 

2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - 재귀
     - 반복문

 

첫번째 풀이
  1. 수포자 3인방의 정답 찍기 패턴을 담은 배열을 만든다
  2. 이 배열들과 answers 배열을 서로 돌면서(?) 각 인덱스가 동일한 요소끼리 비교한다.

  3. 근데 수포자 3인방의 찍기 배열과 answers의 길이가 다 다르니까 
  4. 예를들어서 answers = [1,2,3,4,5,6,7] 일때 수포자1의정답 = [1,2,3,4,5] -> 이 배열의 길이는 5
    answers[5] = 수포자1의정답[0] = 수포자1의정답[answers의 인덱스5 % 수포자1배열의 길이5]
    answers[6] = 수포자1의정답[1] = 수포자1의정답[answers의 인덱스6 % 수포자1배열의 길이5]
  5. answers의 인덱스와 수포자 3인방의 찍기 배열 인덱스로 서로 비교하려면 수포자3인방의 비교 인덱스는 answers의 인덱스를 수포자3인방의 찍기 배열의 길이를 나눴을때 몫이 되겠다
  6. 요소가 같다면 count + 1

  7. 이때 카운트 값을 저장할 배열을 만들어야되겠다.
  8. 그리고 이 카운트 값들을 비교할 수 있는 함수를 새로 만들자

  9. 빈 배열을 만들고 winner
  10. 수포자는 3명이니까 카운트값을 담은 배열의 길이는 3일것이다
  11. 그러니까 카운트값을 담은 배열의 0번째랑 1번째랑 비교해서 
  12. 0번째가 더 크면 winner에 [1]을 넣고 
  13. 크기가 같다면 [1,2]를 넣고
  14. 1번째가 더 크면 winner에 [2]를 넣는다.

  15. 그다음에 winner에 담아둔 [0]번째 인덱스와 카운트값을 담은 배열의 2번째랑 비교한다.
  16. 그런데 winner에 담아둔 [0]번째 인덱스는 카운트값을 담은 배열의 인덱스 -1 이니까 비교할때 주의해야할듯,,?

  17. 쩄던 똑같이 비교해서 winner의 0번쨰수를 인덱스로하는 카운트 배열의 수와 카운트 배열[3]을 비교해서 
  18. winner의 0번쨰수를 인덱스로하는 카운트 배열의 수 > 카운트 배열[3] => 그대로 winner 리턴
  19. winner의 0번쨰수를 인덱스로하는 카운트 배열의 수 = 카운트 배열[3] => winner + 3
  20. winner의 0번쨰수를 인덱스로하는 카운트 배열의 수 = 카운트 배열[3] => [3] 리턴
 

 

두번째 풀이 (7번까지는 동일)

  1. 카운트 값이 가장 많은 사람이 정답을 많이 맞춘 사람
  2. 카운트 값을 저장한 배열에서 가장 큰 숫자를 찾고

  3. 가장 큰 숫자를 가진 사람이 누군지 반복문 돌면서 찾아야된다
  4. 근데 리턴할때 수포자3명을 1,2,3 이런식으로 표현해야하니까,,,
  5. 반복문 돌면서 가장 큰 숫자가 카운트값을 저장한 배열의 요소와 일치하면 
  6. 빈배열에 인덱스+1을 해주고
  7. 이 배열을 리턴

 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.

 

첫번째 풀이

const PersonOne = [1, 2, 3, 4, 5];
const PersonTwo = [2, 1, 2, 3, 2, 4, 2, 5];
const PersonThree = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

const solution = (answers) => {
  const score = [0, 0, 0];

  answers.forEach((answer, index) => {
    if (answer === PersonOne[index % PersonOne.length]) score[0] += 1;
    if (answer === PersonTwo[index % PersonTwo.length]) score[1] += 1;
    if (answer === PersonThree[index % PersonThree.length]) score[2] += 1;
  });
  return finalSolution(score);
};

const finalSolution = (score) => {
  let winner = [];

  if (score[0] > score[1]) {
    winner = [1];
  } else if (score[0] === score[1]) {
    winner = [1, 2];
  } else {
    winner = [2];
  };

  if (score[winner[0]-1] > score[2]) {
    return winner;
  } else if (score[winner[0]-1] === score[2]) {
    return[...winner, 3];
  } else {
    return [3];
  };
}

test('1번이 일등일때', () => {
  expect(solution([1,2,3,4,5])).toEqual([1]);
});

 

 

두번째 풀이 (7번까지는 동일)

const PersonOne = [1, 2, 3, 4, 5];
const PersonTwo = [2, 1, 2, 3, 2, 4, 2, 5];
const PersonThree = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

const solution = (answers) => {
  const score = [0, 0, 0];

  answers.forEach((answer, index) => {
    if (answer === PersonOne[index % PersonOne.length]) score[0] += 1;
    if (answer === PersonTwo[index % PersonTwo.length]) score[1] += 1;
    if (answer === PersonThree[index % PersonThree.length]) score[2] += 1;
  });
  return finalSolution(score);
};

const finalSolution = (score) => {
  const topScore = Math.max(...score);
  let winner = [];

  score.forEach((num, index) => {
    if (num === topScore) winner.push(index + 1);
  })
  return winner;
};

 

4. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
     - 첫번째 풀이를 재귀로 풀어볼 수 있을것같다.
  • 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?
     - 조건을 버리고 풀었으면 더 단계적으로 풀어낼 수 있었을 것 같다.

 

 

Facts & Findings

첫번째 풀이 계획을 작성하고 풀어보니 코드가 너무 복잡했다.
그런데 이 부분을 어떻게 바꿀 수 있을지 생각이 나지 않아서 다른분의 도움을 받았다. 
그렇게 해서 두번째 풀이 방법을 배울 수 있었다. 

forEach 사용하는 법을 잘몰랐었다,,
그래서 항상 for문을 사용했었는데 
오늘 한번 문제에 적용해보니 이해가 되었고 앞으로 for 대신 종종 써봐야겠다. 

'코테연습' 카테고리의 다른 글

56. 폰켓몬 Javascript  (0) 2022.05.31
55. 체육복 Javascript  (0) 2022.05.31
53. 문자열압축 Javascript  (0) 2022.05.27
52. K번째수 Javascript  (0) 2022.05.25
51. 위장 Javascript  (0) 2022.05.25

댓글