티스토리 뷰

💡 문제

로또의 최고 순위와 최저 순위

 

🔍 분석 및 계획

 문제 이해

일부 번호가 가려진 로또번호와 당첨 로또 번호가 주어졌을 때 가려진 번호로 나올수 있는 최저, 최고의 당첨 등수를 맞추는 문제이다

 

  • 입력 값 : 가려진 로또번호, 당첨 로또번호
    - 가려진 번호는 숫자 0으로 표시
    - 로또 번호는 모두 6자리 정수이다
    - 정렬되어 있지 않음
    - 0을 제외하고는 중복되는 수는 없다.
    - 빈배열 없음, 잘못된 값은 들어 있지않음
  • 출력 값 : 최고 등수와 최저등수가 들어있는 배열

 

최고 순위와 최저 순위를 계산하기 위해서는 두 가지 정보를 가지고 있어야 한다

  1. 일치하는 번호의 개수
  2. 가려진 번호의 개수

두가지를 이용하면

  1. 최저 등수 <= 일치하는 번호의 개수
  2. 최고 등수 <= 일치하는 번호의 개수 + 가려진 번호의 개수

위와 같이 출력값에 들어가는 값을 구할 수 있다

 

로또 숫자의 개수와 원소의 개수가 정해져 있기 때문에 주어진 입력값의 변화에 따라 정렬이나 왠만한 내장함수를 써도 O(1)시간이 걸리기때문에 가독성을 위주로 고민해봐도 시간복잡도 상의 큰 불이익은 없을 듯하다.

 

이럴때는 맘 놓고 includes 함수를 사용하기로 한다!

 의사코드 작성

//lottos함수를 반복문으로 순회하며 결과값으로 일치하는 번호의 개수와, 0의개수를 반환
//순위를 계산하는 조건문
    //if(일치하는 개수 1개 이하) return 6
    //else return (7-일치하는 개수)

 

 

📝 코드 구현

의사코드 + 코드

function solution(lottos, win_nums) {
  let max, min;
  //lottos함수를 반복문으로 순회하며 결과값으로 일치하는 번호의 개수와, 0의개수를 반환
  let [matched, undecided] = lottos.reduce((acc, cur) => {
    if (cur === 0) {
      acc[1]++;
      return acc;
    } else {
      if (win_nums.includes(cur)) acc[0]++;
      return acc;
    }
  }, [0, 0]) || [0, 0];
  //순위를 계산하는 조건문
    //if(일치하는 개수 1개 이하) return 6
    //else return (7-일치하는 개수)
  min = matched <= 1 ? 6 : 7 - matched;
  max = matched + undecided <= 1 ? 6 : 7 - (matched + undecided);

  return [max, min];
}

 

최종 코드

function solution(lottos, win_nums) {
  let max, min;
  let [matched, undecided] = lottos.reduce((acc, cur) => {
    if (cur === 0) {
      acc[1]++;
      return acc;
    } else {
      if (win_nums.includes(cur)) acc[0]++;
      return acc;
    }
  }, [0, 0]) || [0, 0];

  min = matched <= 1 ? 6 : 7 - matched;
  max = matched + undecided <= 1 ? 6 : 7 - (matched + undecided);

  return [max, min];
}

시간 복잡도 : O(1)

마음 껏 함수를 써도 상관없는 문제였으나 결국 소극적인 코드가 나와버렸다

💭 되돌아 보기

 개선점

 

 

 다른 사람 풀이

 

1.
minCount와 zeroCount를 각각 실행해주면서 코드가 훨씬 짧아졌다. 또한 랭크를 위한 배열을 따로 생성했다.
이렇게 과감하게 해주었어야 했다..

function solution(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]];
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함