공부/알고리즘&자료구조

항해99 문제33번풀이 (로또의 최고 순위와 최저 순위,프로그래머스)

youngble 2021. 11. 11. 03:12

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

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

+6점 얻음.

 

내가 푼 방법:

 

접근법

미리 알고리즘과 원하는 기능이나 예외등을 구상하기로함

 

1. 각각 입력받은 lottos 의 배열과 win_nums 배열중 일치하는 개 몇개 인지 체크 (includes 사용)

 

2. 비교후 나온 일치갯수가 최소 0에서 최대 6개 인것을 일치할때마다 cnt++ 카운트해주었다. 없으면 0 최대 6까지 증가, 그리고 count된 갯수와 등수가 대응되게 만들것 .ex. 6개 1등이므로  ->[6,5,4,3,2,1] 중 인덱스 5에 해당,

5개 -> 인덱스 4에 해당, …1개일때 와 0개일때 인덱스 0해당. 설정 해줄 배열 만듬 즉. Rank = [6,5,4,3,2,1] 을 설정해줌. 대응할때 갯수에서 -1 한것을 index로 지정하면될것이다. ex 6등에서 1등까지 있는데 index 로 따지면 6등은 index가 [0]이고 1등은 index가 [5]에 해당한다 따라서 rank[cnt-1]로 대응되게 할것

 

3. 아까 하지않았던 최소 맞은갯수를 최저등수로 잡고, 최고 등수를 구하기위해서 현재 0(가려진값)이 몇개 있는지 찾아서 그 갯수와 최소등수일때 가진 값과 더한다

ex 2개를 맞은 lottos에 0이 1개 있다면 2+1 =3 이런식으로.

그럼 최소 2개 는 Rank인덱스1(rank[1]) 과 매치되어 5등이됨, 최대는 3개 이므로 rank 인덱스 2에 해당하므로 4등이 된다

 

4. 예외를 체크할것, cnt도 0개 이면서 지워진 lottos 0의 갯수가 6개 일때 최저는 다 안맞는 경우이고 최대는 다맞는 것(6개)

  그것까지 만족한다면 가능

 

코드 해석

1줄.

민우가 샀던 로또번호 lottos 와 당첨 번호 win_nums 을 파라미터로 지정

2줄~8줄.

rank_best와 rank_worst는 일치하는 갯수의 멕시멈과 미니멈일때의 수를 가질 변수들을 선언 초기화한것이다.

 rank_list 는 그 일치하는 갯수에 해당하는 등수를 리스트 배열을 만들어 index와 대응하게 하기위해 선언및 초기화

lottos와 win_nums가 일치하는게 있을때마다 카운트해서   넣어줄 cnt 선언 초기화, lottos배열안에 숫자 0을  가진 갯수를 넣어줄 zero 선언,초기화, 마지막 result 순위 결과를 넣어줄 빈배열 미리 생성

 

10줄~15줄.

for 문을 실행후 includes를 통해 일치하는 번호가있는지 체크후 있다면 cnt++ 증가 시킴

 

16줄~ 20줄.

reduce를 사용하여 현재값 curr 가 0이라면 zero 값을 ++증감시킴, 초기시작위치는 index 0이다.

21줄. 최하위 등수를 얻기 위해선 가려진 숫자0을 제외한 lottos와 win_nums가 일치한 갯수 그대로

를 list에 대응 시켜야하므로 cnt 를 넣어줌

22줄.

같은 번호 갯수가 0개 혹은 1개일때는 rank_list[0]을 rank_worst에 저장하여 출력할려고함.

23줄.

그 외엔 index 값을 rank_worst-1로 지정하여 등수에 해당하는 값을 넣어줌

24~27줄.

23줄과 마찬가지로 등수에 해당하는 배열 index의 값을 rank_best에 넣어주고 마지막 result 값을 [rank_best,rank_worst]로 넣어줌

 

 

 

다른사람풀이

 

filter(), arrow funtion 사용, 6등을 하나더 중복해서 넣어줌