사용자로부터 로또 번호를 받아서, 몇 등에 당첨되었는지 시뮬레이션합니다.
def make_lotto_numbers():
pool = list(range(1, 45+1))
shuffle(pool)
return pool[:6], pool[6]로또 번호를 추첨합니다. 1부터 45까지의 정수가 담긴 리스트를 만들고, 이 리스트를 완전히 셔플한 뒤 첫 6개 번호만을 받아오는 방식입니다. 번호 추첨을 이렇게 구현한 이유는 다음과 같습니다.
- 구현을 최대한 단순하게 만들어서 문제가 있을 여지를 줄이기 위함입니다.
- 특히, 모든 값이 편의 없이 항상 같은 확률으로 뽑힐 것임을 확실하게 하기 위함입니다.
- 뽑힌 값에 중복값이 없음을 확실하게 하기 위함입니다.
- 번호 추첨이 랜덤값과 관계없이 항상 일정한(예측 가능한) 연산 시간을 사용하게 하기 위함입니다.
def main():
input_nums = set(map(int, input("숫자 6개를 입력: ").split()))
if len(input_nums) != 6:
return print("중복되지 않는 숫자 6개를 입력해주세요.")set 자료구조는 중복된 값을 제거합니다. 따라서 중복된 값을 넣거나 6개 이외의 숫자를 넣을 경우 여기에서 걸러지게 됩니다.
if not all(map(lambda x: 1 <= x <= 45, input_nums)):
return print("1~45 사이의 숫자를 입력해 주세요.")input_nums의 모든 값들이 1 <= x <= 45 조건을 만족하는지 검사합니다.
lotto_nums, bonus_num = make_lotto_numbers()
lotto_nums = set(lotto_nums)
sames = len(input_nums & lotto_nums)
get_bonus = bonus_num in input_nums코드의 가독성을 높이기 위한 변수 선언입니다.
두 set 객체간의 & (bitwise and) 연산은, 두 집합 간의 교집합을 반환합니다. 이를 sames를 선언할 때 사용하였습니다.
print(f"당신의 숫자: {input_nums}")
print(f"추첨된 숫자: {lotto_nums} + 보너스번호 {bonus_num}")
print(f"맞춘 번호: {sames}개")
if sames == 6:
print("1등입니다.")
elif sames == 5 and get_bonus:
print("2등입니다.")
elif sames == 5:
print("3등입니다.")
elif sames == 4:
print("4등입니다.")
elif sames == 3:
print("5등입니다.")
else:
print("낙첨입니다.")로또 규칙에 따라 등수를 정합니다.