Algorithm/코딩테스트 연습

[프로그래머스] 로또의 최고 순위와 최저 순위

yennle 2022. 1. 6. 16:07
728x90

 

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

 

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

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

programmers.co.kr

 

<문제 설명>

로또 번호 6개를 이용하여 로또의 순위를 정하는 문제이다. 

하지만 6개 중 일부는 알아볼 수 없어 0으로 표기되어있으며, 이 로또의 최고 순위와 최저 순위를 출력하면 된다.

 

 

<문제풀이>

로또 번호가 가장 많이 일치하는 경우 : 맞힌 숫자의 개수 + 0의 개수

로또 번호를 가장 적게 일치하는 경우 : 맞힌 숫자의 개수

 

따라서 일치하는 숫자의 개수를 세고, 0의 개수를 세면된다고 생각했다.

 

 

<나의 풀이>

def solution(lottos, win_nums):
    zero_count = 0
    ans_count = 0
    
    for num in lottos: 				# lottos에서 하나씩 꺼낸다
        if num != 0 : 				# 그 숫자가 0이 아니고
            if num in win_nums:			# win_num에 있으면
                ans_count += 1
        else:					# 그 숫자가 0이면
            zero_count += 1
    
    max_rank = 7 - (zero_count + ans_count) 	# 최대 순위
    min_rank = 7 - ans_count 			# 최저 순위
    
    if max_rank > 6 : max_rank = 6 		# 순위가 6보다 커지는 것을 방지
    if min_rank > 6 : min_rank = 6
    
    return [max_rank, min_rank]

for문을 이용하여 0의 개수와 일치하는 숫자의 개수를 구했다.

그 값을 이용하여 최대 순위와 최저 순위를 구했으며, 

순위가 6보다 커지는 것을 방지하기 위해 if문을 추가했다.

 

 

<풀이 개선>

0을 세는 방법을 for문이 아닌 lottos.count(0)을 사용한다.

또한 여러부분에서 굳이 코드를 따로 쓰지 않고 합쳐서 쓰는 방식을 이용하여 코드의 길이를 줄일 수 있다.

def solution(lottos, win_nums):
    
    zero_count = lottos.count(0)
    ansList = [x for x in lottos if x in win_nums]
    
    max_rank = 7 - (zero_count + len(ansList))
    min_rank = 7 - len(ansList) 
    
    if max_rank > 6 : max_rank = 6
    if min_rank > 6 : min_rank = 6
    
    return [max_rank, min_rank]

 

오잉 시간이 더 걸리네,,,, 아주 아주 조금이지만,,,

for문을 두번 돌린것과 다름없어서 그런가 하는 나의 개인적인 생각,,,

그래도 이런 방법도 있다는 걸 알아두자~

 

 

<얻은 지식>

a = 3
b = 5 + a if a > 2 else 5
b
8
a = 7
b = 5 + a if a > 2 else 5
b
12
a = 7
c = 6
b = 5 + c if a >2 else 5
b
11
728x90