로또당첨

YEONGHUN KO·2021년 12월 21일
0

ALGORITHMS - PRACTICE

목록 보기
44/50
post-thumbnail

1. 로또당첨

이번엔 로또 당첨 여부를 알아본다. lottos와 win_nums가 pass된다. lottos에는 내가 뽑은 로또 번호가 있고 wins_nums에는 당첨번호가 적혀있다. 보통 로또와는 다르게 내가 뽑은 번호가 wins_nums에도 있으면 당첨 번호를 1개 획득한것이다.

근데 뽑은 번호중에 동생이 실수로 쥬스를 흘려서 지워진 번호가 있다. 그 번호는 0으로 표시한다. 이때 0이 모두 당첨되는 경우와 모두 당첨되지 않은 경우를 나뉘어 최대, 최소 순위가 매겨진다. 순위는 아래와 같이 측정된다.

순위당첨내용
16개 번호가 모두 일치
25개 번호가 모두 일치
34개 번호가 모두 일치
43개 번호가 모두 일치
52개 번호가 모두 일치
6(낙첨)그외

이때 최대와 최소순위를 리턴하여라.

예시

lottos                  win_nums                result
[44, 1, 0, 0, 31, 25]	[31, 10, 45, 1, 6, 19]	 [3, 5]

2. 접근 방법

  • pseudo code

  • answer를 0으로 잡자.

  • lottos를 순회한다.

  • 순회하면서 filter 또는 includes 또는 Set/has를 통해서 win_nums에서 일치하는 갯수와 0의 갯수를 알아내자

  • 그리고 0의 갯수 + 일치하는 갯수 를 갖고 계산

  • 일치하는 갯수만 가지고 계산!

  • answer를 리턴

요렇게 우선 로직을 짜고 나름대로 코드를 짜보았다.

function mySolution(lottos, win_nums) {
  let answer = [];
  let same = 0;
  let zero = 0;

  let combined;
  for (let i = 0; i < lottos.length; i++) {
    let found = win_nums.includes(lottos[i]);
    if (found) {
      same++;
    }
    if (lottos[i] === 0) zero++;
  }

  // 최대값계산
  combined = same + zero;
  if (combined === 6) answer.push(1);
  else if (combined === 5) answer.push(2);
  else if (combined === 4) answer.push(3);
  else if (combined === 3) answer.push(4);
  else if (combined === 2) answer.push(5);
  else answer.push(6);

  // 최솟값 계산
  if (same === 6) answer.push(1);
  else if (same === 5) answer.push(2);
  else if (same === 4) answer.push(3);
  else if (same === 3) answer.push(4);
  else if (same === 2) answer.push(5);
  else answer.push(6);

  return answer;
}

근데 항상 그렇지만 훨씬 더 간단하게 만드는 방법이 있다. 당첨된 번호를 array에 넣은다음 length만 가지고 순위를 리턴하는 방법이다. 두가지 solution을 동시에 적어보겠다.

function solution2(lottos, win_nums) {
  const rank = [6, 6, 5, 4, 3, 2, 1];

  let minCount = lottos.filter((v) => win_nums.includes(v)).length;
  let zeroCount = lottos.filter((v) => !v).length;

  const maxCount = minCount + zeroCount;

  return [rank[maxCount], rank[minCount]];
}

function solution3(lottos, win_nums) {
  const rank = [6, 6, 5, 4, 3, 2, 1];
  let answer = [];
  let min = [];
  let max = [];

  lottos.forEach((x) => {
    if (x == 0) {
      max.push(x);
      return;
    }
    let val = win_nums.find((y) => y == x);
    if (val) {
      min.push(val);
      max.push(val);
    }
  });

  answer.push(rank[max.length]);
  answer.push(rank[min.length]);

  return answer;
}

// lottos                  win_nums                result
// [44, 1, 0, 0, 31, 25]	[31, 10, 45, 1, 6, 19]	 [3, 5]

쉬운 접근법이면서 깔끔하다. 오케이 끝!

3. 배운점

  • 최대 최소를 찾아내는 방법도 map/filter를 통해서 찾아냄.

  • solution2 에서 zero찾아낼때 !v로 찾아내는 방법도 신선했고.

  • 담엔 map,filter,forEach같은 higher-order function으로 답을 찾아보려고 해봐야겠다.

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

0개의 댓글