본문 바로가기
알고리즘/프로그래머스

python으로 로또 번호 뽑기

by 개발하는 호랑이 2024. 2. 17.

이 글을 작성하는 시점은 토요일 오후 시간이다.
점심 즈음에 '토요일이니까 로또 사야지' 하는 생각을 하다가, 로또 번호를 내가 그냥 하는 것보단, 개발자스럽게 코옴퓨타께서 점지해 주시는 번호로 로또를 구매하는 것이 좋지 않을까라는 생각이 들었다.

그래서 일단 로또와 관련된 api가 있는지 확인해봤다.

오 있다.

로또 API

https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=회차번호

위 주소로 들어가서 회차번호에 지금까지 있었던 회차번호를 입력하면 관련한 숫자가 입력된 정보값을 json으로 받을 수 있다.
아래처럼 나온다.

{
  "totSellamnt": 126617296000,
  "returnValue": "success",
  "drwNoDate": "2024-02-10",
  "firstWinamnt": 2790462819,
  "drwtNo6": 45,
  "drwtNo4": 29,
  "firstPrzwnerCo": 11,
  "drwtNo5": 42,
  "bnusNo": 36,
  "firstAccumamnt": 30695091009,
  "drwNo": 1106,
  "drwtNo2": 3,
  "drwtNo3": 4,
  "drwtNo1": 1
}

만약 아직 추첨을 하지 않은 회차라면 아래처럼 나온다.

{
  "returnValue": "fail"
}

난 이 것을 바탕으로 우선 간단하게 지금까지 나왔던 번호 리스트와 같은 번호 리스트가 나오면 새롭게 번호 리스트를 제공하도록 했다.

python 코드

역대 로또 번호 저장

난 json파일로 저장하는 코드를 생성했다.

로또번호는 결국 보너스 번호보단 원래의 6개의 번호가 다 맞는 것이 아주 큰 의미가 있기 때문에 번호는 보너스 번호는 제외한 6개의 번호만을 각 회차별로 리스트에 담아서 저장을 했다.

import requests
import json

lotto_numbers_list = []
round_lotto = 1
while True:
    drwNo = round_lotto
    url = f'https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo={drwNo}'

    response = requests.get(url)
    data = response.json()
    if data['returnValue'] == 'fail':
        print(f'{drwNo}회는 아직 추첨하지 않았습니다.')
        break
    else:
        lotto_numbers_list.append([data['drwtNo1'],data['drwtNo2'],data['drwtNo3'],data['drwtNo4'],data['drwtNo5'],data['drwtNo6']])
    round_lotto += 1

# JSON 파일로 저장
with open('lotto_numbers.json', 'w', encoding='utf-8') as f:
    json.dump(lotto_numbers_list, f, ensure_ascii=False, indent=2)

나만의 로또 번호 생성

그리고 json파일이 생성되었으면, 이 파일을 토대로 radmom.randint() 대신에 random.sample()을 이용해서, 6개의 번호를 뽑아내는 방식을 사용했다. 이유는 randint를 사용하면 내가 직접 이전에 나온 번호랑 겹치는지 확인해줘야 하는데, sample을 이용하면 그럴 필요는 없기 때문이다.

그리고 만약 random.sample()로 나온 번호 리스트가 json에 이미 존재하는 번호 리스트면 재추첨을 하여서 새로운 로또 번호를 뽑도록 하였다.

import random
import json

# JSON 파일에서 로또 번호 불러오기
with open('lotto_numbers.json', 'r', encoding='utf-8') as f:
    lotto_numbers_list = json.load(f)

while True:
    numbers = list(range(1, 46))  # 1부터 45까지의 숫자 리스트를 생성
    new_numbers = random.sample(numbers, 6)  # 새로운 로또 번호 뽑기
    new_numbers.sort()  # 번호 정렬

    # 추첨된 로또 번호와 중복 확인
    if new_numbers not in lotto_numbers_list:
        print(new_numbers)
        break

이렇게 하니 나만의 로또 번호가 생성되었다.
다음에 더 담아서 확률을 조금이라도 올릴 수 있는 방법이 생각나면, 그 방법도 넣어보고, 연금복권도 api 구하거나 아니면, 크롤링으로 해봐야지.

후후후... 이제 로또 1등은 나의 것.