728x90
반응형
SMALL
파이썬 실전 프로젝트
"로또 시뮬레이션"
▪ 출처 : 코드잇 codeit
▪ 기간 : 2023-09-15
▪ 소요 시간 : 1시간
프로젝트 소개
로또는 주 1회 간격으로 당첨자를 발표합니다. 참여 횟수에 제한이 없어서, 한 사람이 한 회차에 여러 번 참여할 수도 있습니다. 고를 수 있는 번호는 1부터 45까지 있는데요. 주최측에서는 매주 6개의 '일반 당첨 번호'와 1개의 '보너스 번호'를 뽑습니다. 그리고 참가자는 참여할 때마다 서로 다른 번호 6개를 선택합니다. 당첨 액수는 아래 규칙에 따라 결정됩니다.
- 내가 뽑은 번호 6개와 일반 당첨 번호 6개 모두 일치: 10억 원
- 내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치, 그리고 내 번호 1개와 보너스 번호 일치: 5천만 원
- 내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치: 100만 원
- 내가 뽑은 번호 4개와 일반 당첨 번호 4개 일치: 5만 원
- 내가 뽑은 번호 3개와 일반 당첨 번호 3개 일치: 5천 원
필요한 기능
- generate_numbers(n) : 서로 다른 무작위 숫자 n개를 리스트로 호출 (1~45 사이의 숫자 6개 호출)
- draw_winning_numbers() : 일반 번호 6개, 보너스 번호 1개를 포함한 리스트 호출
- count_matching_numbers(list1, list2) : 로또 번호가 겹치는지 확인
- check() : 당첨 금액 확인
프로그래밍 과정
1. 번호 뽑기
from random import randint
def generate_numbers(n):
numbers = []
while len(numbers) < n :
num = randint(1, 45)
if num not in numbers :
numbers.append(num)
return numbers
내 로또 번호가 될 numbers 리스트를 생성하고, 1~45 사이 숫자를 랜덤하게 뽑아서 이 리스트에 넣었다.
중복을 피하기 위해 if문에 조건을 걸었고, 이는 리스트에 6개가 채워질 때까지 반복한다.
사실 random.sample() 함수를 이용하면 더 쉽지만, Computing tinking을 위해 미리 주어진 함수를 이용해서 풀어야 했다.
import random
def generate_numbers(n):
return random.sample(range(1,46), n)
2. 당첨 번호 뽑기
from random import randint
def draw_winning_numbers():
lotto = []
while len(lotto) < 6 :
num = randint(1, 45)
if num not in lotto :
lotto.append(num)
lotto.sort()
bonus = randint(1, 45)
if bonus not in lotto :
lotto.append(bonus)
return lotto
나의 풀이는 앞선 1번에서와 비슷하게 작성한 것이다.
하지만, 1번의 함수를 이용하여 더 간결하게 작성할 수도 있다.
from random import randint
def generate_numbers(n):
numbers = []
while len(numbers) < n :
num = randint(1, 45)
if num not in numbers :
numbers.append(num)
return numbers
def draw_winning_numbers():
winning_numbers = generate_numbers(7)
return sorted(winning_numbers[:6]) + winning_numbers[6:]
3. 겹치는 번호 개수
def count_matching_numbers(numbers, winning_numbers):
return len(set(numbers) & set(winning_numbers))
겹치는 것이라고 하니 바로 교집합이 생각났고, 교집합이라고 하니 세트가 생각났다.
리스트를 세트로 형변환 하고, 교집합을 구한 후에 그 개수를 len() 함수를 통해 구했다.
하지만 여기에서 원하는 것은 더 풀어서 쓴 코드이다.
def count_matching_numbers(numbers, winning_numbers):
count = 0
for i in numbers :
if i in winning_numbers :
count += 1
return count
4. 당첨금 확인
def count_matching_numbers(numbers, winning_numbers):
count = 0
for i in numbers :
if i in winning_numbers :
count += 1
return count
def check(numbers, winning_numbers):
count = count_matching_numbers(numbers, winning_numbers[:6])
bonus_count = count_matching_numbers(numbers, winning_numbers[6:])
if count == 6 :
return 1000000000
elif count == 5 and bonus_count == 1 :
return 50000000
elif count == 5 :
return 1000000
elif count == 4 :
return 50000
elif count == 3 :
return 5000
마지막 번호를 구하기 위해서 winning_numbers[6:] 대신 winning_numbers[-1]을 작성하면 안 된다.
4번째 줄에 if i in winning_numbers가 있는데, A [not] in B 형태에서 B는 iterable 이어야 하며, int 는 iterable이 아니기 때문이다.
최종 프로젝트 파일
from random import randint
def generate_numbers(n):
"""번호 뽑기"""
numbers = []
while len(numbers) < n :
num = randint(1, 45)
if num not in numbers :
numbers.append(num)
return numbers
def draw_winning_numbers():
"""당첨 번호 뽑기"""
winning_numbers = generate_numbers(7)
return sorted(winning_numbers[:6]) + winning_numbers[6:]
def count_matching_numbers(numbers, winning_numbers)
"""겹치는 번호 개수"""
count = 0
for i in numbers :
if i in winning_numbers :
count += 1
return count
def check(numbers, winning_numbers):
"""당첨 확인"""
count = count_matching_numbers(numbers, winning_numbers[:6])
bonus_count = count_matching_numbers(numbers, winning_numbers[6:])
if count == 6 :
return 1000000000
elif count == 5 and bonus_count == 1 :
return 50000000
elif count == 5 :
return 1000000
elif count == 4 :
return 50000
elif count == 3 :
return 5000
728x90
반응형
LIST
'Coding Study > Project' 카테고리의 다른 글
[Project_python] 숫자 야구 (코드잇) (0) | 2023.09.15 |
---|