• 티스토리 홈
  • 프로필사진
    소쩍소쩍이
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
소쩍소쩍이
  • 프로필사진
    소쩍소쩍이
    • 분류 전체보기 (51) N
      • 파이썬 (18)
        • 문제 및 예제 (8)
      • PySide6 (15) N
        • Signal & Slot (6)
        • Layout (8)
        • Model & View (1) N
      • 리눅스 (5)
      • 아두이노 (0)
      • 일지 (11)
  • GitHub
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • 간단한 프로그램 만들기 8 (로또 키오스크 만들기)
      2026년 04월 17일
      • 소쩍소쩍이
      • 작성자
      • 2026.04.17.:53

      로또 키오스크 만들기

      로또 키오스크를 만들어 볼 것이며 조건은 이렇습니다.

      입력받은 값은 예외가 없도록 만들어 주세요.
      자동, 반자동, 수동을 선택하세요.
      최대 1~5개의 로또를 선택하세요.
      입금과 잔돈을 결제하고, 결제 결과로 영수증을 출력하세요.
      영수증에 발행일시(현재), 추첨일(해당 주 토요일), 지급기한(1년)을 출력하세요.

      1. 모듈 불러오기

      일단 2개의 모듈을 가져와야 합니다.

      import datetime
      import random

      2. 구매 개수 입력 함수

      처음으로 로또의 구매 개수를 확인하는 함수이고 실제 로또와 같이 최소 1개, 최대 5개까지 구매할 수 있도록 해 놓았습니다.

      def buy():
          while True:
            num1_input = input("구매 갯수를 적으세요 >> ")
            if num1_input.strip() == "":
              continue
            buy_num = int(num1_input)
            if 1 <= buy_num <= 5:
              return buy_num
            else :
              print("잘못된 숫자를 입력 하셨습니다.")
              print("갯수는 1~5개 입니다.")

      3. 로또 번호 선택 방식

      그 후 어떤 방식으로 로또 번호를 받을 것인지 정하는 곳

      def mode():
          while True:    
            num2_input = input("""
            1. 자동
            2. 반자동
            3. 수동
            입력 >> 
            """)
            if num2_input.strip() == "":
              print("다시 입력해 주세요")
              continue
            mode_num = int(num2_input)
            if mode_num in [1,2,3]:
              return mode_num
            else:
              print("1~3번 중에 골라 주세요")

      각 모드는 자동, 수동, 반자동으로 나누었습니다.

      자동 모드

      # 자동 모드
      def outo_mode():
        b = []
        while len(b) < 6:
          n = random.randint(1,45)
          if n not in b:
            b.append(n)
        return b

      수동 모드

      # 수동모드
      def self():
        b = []
        while len(b)<6:
          num = int(input(f"{len(b)+1}번 입력 >> "))
          if not ( 1<= num <= 45):
            print("1~45의 숫자 중 입력해 주세요")
          elif num in b :
            print("중복입니다.")
            print("다시 입력해 주세요")
          else:
            b.append(num)
        return b

      반자동 모드

      # 반자동 모드
      def semi_outo():
        b = []
        while len(b)<6:
          num = int(input(f"{len(b)+1}번 입력 >> "))
          if num == 0:
              while len(b) < 6:
                n = random.randint(1,45)
                if n not in b:
                  b.append(n)
              break
          if not ( 1<= num <= 45):
            print("1~45의 숫자 중 입력해 주세요")
          elif num in b :
            print("중복입니다.")
            print("다시 입력해 주세요")
          else:
            b.append(num)
        return b

      4. 출력표 만들기

      이렇게 모드들을 나누고, 우리가 로또를 살 때 종이를 받는 것처럼 그 종이를 표현하는 출력표를 만들었습니다.

      제일 아래에 있는 입금액, 결제금액, 잔돈 부분은 위에 코드에서 안 보이는데 어디 있나 하실 수도 있는데 이 부분은 나중에 추가로 넣었습니다.

      # 출력표
      def print_lotto(result,money,price,change):
        today = datetime.datetime.today() + datetime.timedelta(hours=9)
        days_sat = (5 - today.weekday()) % 7
        draw_day = today + datetime.timedelta(days=days_sat)
        expire_day = draw_day + datetime.timedelta(days=365)
      
        print("Lotto 6/45")
        print("발행일 : ", today.year,"/", today.month,"\t(" ,today.day,")\t", today.hour,":", today.minute,":", today.second)
        print("추첨일 : ", draw_day.year,"/", draw_day.month,"\t(" ,draw_day.day,")")
        print("지급기한 : ", expire_day.year,"/", expire_day.month,"\t(" ,expire_day.day,")")
      
        for i in range(len(result)):
          print("♣",result[i],"♣")
        print("-----------------------------------------------------")
        print("입금액 : ", money, "원")
        print("결제금액 : ", price, "원")
        print("잔돈 : ", change, "원")

      5. 실행 함수 만들기

      이후 로또 실행 함수를 만들어 실행 함수를 불러온다면 로또 키오스크가 완성!!

      # 실행
      def LOTTO():
        print("-----------------------------------------------------")
        buy_count = buy()
        mode_m = mode()
        money, price, change = pay(buy_count)
        result = []
      
        if mode_m == 1:
          print("자동을 선택")
          for i in range(buy_count):
            result.append(outo_mode())
        elif mode_m == 2:
          print("반자동을 선택")
          print("0을 입력하면 자동으로 넘어갑니다.")
          for i in range(buy_count):
            print(f"{i+1}번 입력")
            result.append(semi_outo())
        elif mode_m == 3:
          print("수동을 선택")
          for i in range(buy_count):
            print(f"{i+1}번 입력")
            result.append(self())
        print_lotto(result, money, price, change)

      6. 결제 금액 함수 추가

      위에서 말한 추가로 넣은 결제 금액 함수이고 추가로 넣다 보니 오류가 좀 나왔지만, 오류에 대한 것은 다음 글에 작성할 예정입니다.

      # 금액 결제
      def pay(buy_count):
          price = buy_count * 1000
          while True:
              money_input = input("입금 금액을 입력하세요 >> ")
              if money_input.strip() == "":
                  continue
              money = int(money_input)
              if money < price:
                  print("금액이 부족합니다.")
                  print(f"{price}원 이상 입력해주세요.")
                  continue
              change = money - price
              return money, price, change

      코드 전문

      import datetime
      import random
      
      # 로또 구매 갯수 결정
      def buy():
          while True:
            num1_input = input("구매 갯수를 적으세요 >> ")
            if num1_input.strip() == "":
              continue
            buy_num = int(num1_input)
            if 1 <= buy_num <= 5:
              return buy_num
            else :
              print("잘못된 숫자를 입력 하셨습니다.")
              print("갯수는 1~5개 입니다.")
      
      # 자동 반자동 수동 결정
      def mode():
          while True:    
            num2_input = input("""
            1. 자동
            2. 반자동
            3. 수동
            입력 >> 
            """)
            if num2_input.strip() == "":
              print("다시 입력해 주세요")
              continue
            mode_num = int(num2_input)
            if mode_num in [1,2,3]:
              return mode_num
            else:
              print("1~3번 중에 골라 주세요")
      
      # 자동 모드
      def outo_mode():
        b = []
        while len(b) < 6:
          n = random.randint(1,45)
          if n not in b:
            b.append(n)
        return b
      
      # 수동모드
      def self():
        b = []
        while len(b)<6:
          num = int(input(f"{len(b)+1}번 입력 >> "))
          if not ( 1<= num <= 45):
            print("1~45의 숫자 중 입력해 주세요")
          elif num in b :
            print("중복입니다.")
            print("다시 입력해 주세요")
          else:
            b.append(num)
        return b
      
      # 반자동 모드
      def semi_outo():
        b = []
        while len(b)<6:
          num = int(input(f"{len(b)+1}번 입력 >> "))
          if num == 0:
              while len(b) < 6:
                n = random.randint(1,45)
                if n not in b:
                  b.append(n)
              break
          if not ( 1<= num <= 45):
            print("1~45의 숫자 중 입력해 주세요")
          elif num in b :
            print("중복입니다.")
            print("다시 입력해 주세요")
          else:
            b.append(num)
        return b
      
      # 금액 결제
      def pay(buy_count):
          price = buy_count * 1000
          while True:
              money_input = input("입금 금액을 입력하세요 >> ")
              if money_input.strip() == "":
                  continue
              money = int(money_input)
              if money < price:
                  print("금액이 부족합니다.")
                  print(f"{price}원 이상 입력해주세요.")
                  continue
              change = money - price
              return money, price, change
      
      # 출력표
      def print_lotto(result,money,price,change):
        today = datetime.datetime.today() + datetime.timedelta(hours=9)
        days_sat = (5 - today.weekday()) % 7
        draw_day = today + datetime.timedelta(days=days_sat)
        expire_day = draw_day + datetime.timedelta(days=365)
      
        print("Lotto 6/45")
        print("발행일 : ", today.year,"/", today.month,"\t(" ,today.day,")\t", today.hour,":", today.minute,":", today.second)
        print("추첨일 : ", draw_day.year,"/", draw_day.month,"\t(" ,draw_day.day,")")
        print("지급기한 : ", expire_day.year,"/", expire_day.month,"\t(" ,expire_day.day,")")
      
        for i in range(len(result)):
          print("♣",result[i],"♣")
        print("-----------------------------------------------------")
        print("입금액 : ", money, "원")
        print("결제금액 : ", price, "원")
        print("잔돈 : ", change, "원")
        
      # 실행
      def LOTTO():
        print("-----------------------------------------------------")
        buy_count = buy()
        mode_m = mode()
        money, price, change = pay(buy_count)
        result = []
      
        if mode_m == 1:
          print("자동을 선택")
          for i in range(buy_count):
            result.append(outo_mode())
        elif mode_m == 2:
          print("반자동을 선택")
          print("0을 입력하면 자동으로 넘어갑니다.")
          for i in range(buy_count):
            print(f"{i+1}번 입력")
            result.append(semi_outo())
        elif mode_m == 3:
          print("수동을 선택")
          for i in range(buy_count):
            print(f"{i+1}번 입력")
            result.append(self())
        print_lotto(result, money, price, change)
      
      LOTTO()

       


       

      순서도

      '파이썬 > 문제 및 예제' 카테고리의 다른 글

      간단한 프로그램 만들기 7 (야구게임)  (0) 2026.04.17
      간단한 프로그램 만들기 1 (계산기)  (0) 2026.04.16
      함수 예제 및 문제  (0) 2026.04.13
      리스트 예제 및 문제  (0) 2026.04.10
      반복구조 예제 및 문제  (0) 2026.04.09
      다음글
      다음 글이 없습니다.
      이전글
      이전 글이 없습니다.
      댓글
    조회된 결과가 없습니다.
    스킨 업데이트 안내
    현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
    ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바