[Codeit - python] 로또 시뮬레이션

SUNGJIN KIM·2021년 9월 20일
2

codeit

목록 보기
6/18

문제

규칙

로또는 주 1회씩 열립니다.
하지만 한 사람이 한 회차에 여러 번 참여할 수도 있습니다.
번호는 1부터 45까지 있는데요.
주최측에서는 매주 6개의 '일반 당첨 번호'와 1개의 '보너스 번호'를 뽑습니다.
그리고 참가자는 1번 참여할 때마다 서로 다른 번호 6개를 선택합니다.

당첨 액수는 아래 규칙에 따라 결정됩니다.
내가 뽑은 번호 6개와 일반 당첨 번호 6개 모두 일치 (10억 원)
내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치, 그리고 내 번호 1개와 보너스 번호 일치 (5천만 원)
내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치 (100만 원)
내가 뽑은 번호 4개와 일반 당첨 번호 4개 일치 (5만 원)
내가 뽑은 번호 3개와 일반 당첨 번호 3개 일치 (5천 원)

함수

generate_numbers
이 함수는 파라미터로 정수 n을 받습니다. 무작위로 1과 45 사이의 서로 다른 번호 n개를 뽑고, 그 번호들이 담긴 리스트를 리턴합니다.

draw_winning_numbers
일반 당첨 번호 6개와 보너스 번호 1개가 포함된 리스트를 리턴합니다. 일반 당첨 번호 6개는 정렬되어 있어야 하고, 보너스 번호는 마지막에 추가하면 됩니다.

count_matching_numbers
파라미터로 리스트 list_1과 리스트 list_2를 받고, 두 리스트 사이에 겹치는 번호 개수를 리턴합니다.

check
참가자의 당첨 금액을 리턴합니다. 파라미터로 참가자가 뽑은 번호가 담긴 리스트 numbers와 주최측에서 뽑은 번호가 담긴 리스트 winning_numbers를 받는데요. numbers는 당연히 번호 여섯 개를 담고 있고, winning_numbers는 보너스까지 해서 번호 7개를 담고 있겠죠?

문제풀이

1. generate_numbers

def generate_number(num):
    num_list = []
    for i in range(0,num):
        num_list.append(randint(1,45))
    return num_list

2. draw_winning_numbers

def draw_winning_numbers():
    winning_numbers = generate_numbers(7)
    return sorted(winning_numbers[:6]) + winning_numbers[6:]

3. count_matching_numbers

원래는 cnt를 통해서 맞는 개수를 반환했는데, 이렇게 진행할 경우 몇몇 케이스에서 오류가 발생하는 현상을 확인하였다.
이에 맞는 번호를 배열의 형식으로 반환하도록 개선하였다.

def count_matching_numbers(numbers, winning_numbers):
    new_list = []
    for i in winning_numbers:
        if i in numbers:
            new_list.append(i)
    return new_list

4. check

앞전 count_matching_numbers의 return 값이 바뀌었으므로, 그에 맞춰서 check함수도 변경하였다.
이렇게 진행 시, 오류가 발생하는 케이스에서 통과함을 확인하였다.

def check(numbers,winning_numbers):
    check_list = count_matching_numbers(numbers,winning_numbers)
    winning_price = 0
    if len(check_list) == 6:
        if winning_numbers[6] in check_list:
            winning_price = 50000000
        else:
            winning_price = 100000000
    elif len(check_list) == 5:
        winning_price = 1000000
    elif len(check_list) == 4:
        winning_price = 50000
    elif len(check_list) == 3:
        winning_price = 5000
    return winning_price
    

실행 결과

https://woonmong712.github.io/python_study/lottery_simulator/lottery.html

전체 코드

from random import *

NUMBER = 6

def generate_numbers(n):
    num_list = []
    while len(num_list) < n:
        num = randint(1, 45)
        if num not in num_list:
            num_list.append(num)
    #print(num_list)
    return num_list

def draw_winning_numbers():
    winning_numbers = generate_numbers(7)
    return sorted(winning_numbers[:6]) + winning_numbers[6:]

def count_matching_numbers(numbers, winning_numbers):
    new_list = []
    for i in winning_numbers:
        if i in numbers:
            new_list.append(i)
    return new_list


def check(numbers,winning_numbers):
    check_list = count_matching_numbers(numbers,winning_numbers)
    winning_price = 0

    if winning_numbers[6] not in check_list:
        if len(check_list) == 6:
            winning_price = 100000000
        elif len(check_list) == 5:
            winning_price = 1000000
        elif len(check_list) == 4:
            winning_price = 50000
        elif len(check_list) == 3:
            winning_price = 5000
    elif winning_numbers[6] in check_list:
        if len(check_list) == 6:
            winning_price = 50000000
        elif len(check_list) == 5:
            winning_price = 50000
        elif len(check_list) == 4:
            winning_price = 5000

    return winning_price
    
#print(f"금액 : {check(generate_numbers(NUMBER),draw_winning_numbers())} 원")

스크린샷

최종 결과에 맞춰 문제에 주어진대로 html 형식에 맞춰 로또 번호가 정상적으로 노출되는지 확인하였다.

case 1:

#1등
prize = lottery.check(WINNING_NUMBERS[:6],WINNING_NUMBERS)
tries.append((WINNING_NUMBERS[:6],prize))

실행 결과 확인 시, 정상적으로 값이 노출되는 것 확인

case 2:

#2등
example = WINNING_NUMBERS[:5] + WINNING_NUMBERS[6:]
prize = lottery.check(example,WINNING_NUMBERS)
tries.append((example,prize))

case 3:

#3등
example = WINNING_NUMBERS[:5] + [46] 
prize = lottery.check(example,WINNING_NUMBERS)
tries.append((example,prize))

case 4:

#4등
example = WINNING_NUMBERS[:4] + [46,47] 
prize = lottery.check(example,WINNING_NUMBERS)
tries.append((example,prize))

case 5:

#5등
example = WINNING_NUMBERS[:3] + [46,47,48] 
prize = lottery.check(example,WINNING_NUMBERS)
tries.append((example,prize))

case 6:

그 외 당첨되지 않는 케이스 (보너스번호가 있는 경우, 없는 경우)

example = WINNING_NUMBERS[:2] + [46,47,48,49] 
prize = lottery.check(example,WINNING_NUMBERS)
tries.append((example,prize))

example = WINNING_NUMBERS[:2] + [50,51,52] + WINNING_NUMBERS[6:] 
prize = lottery.check(example,WINNING_NUMBERS)
tries.append((example,prize))

profile
#QA #woonmong

0개의 댓글