본문 바로가기

[Python] 데이터 분석

[Python]#3. 백준 2480번 주사위 세 개

 

문제 출처: https://www.acmicpc.net/problem/2480

[문제]
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

[최초에 작성한 코드]

print("상금을 계산할 숫자를 입력해 주세요!")

a = int(input())
if (a <= 0) or (a >= 7):
    print("숫자를 잘못 입력하셨습니다. 입력 가능한 숫자는 1부터 6까지 입니다.")
    a = int(input())

b = int(input())
if (b <= 0) or (b >= 7):
    print("숫자를 잘못 입력하셨습니다. 입력 가능한 숫자는 1부터 6까지 입니다.")
    b = int(input())

c = int(input())
if (c <= 0) or (c >= 7):
    print("숫자를 잘못 입력하셨습니다. 입력 가능한 숫자는 1부터 6까지 입니다.")
    c = int(input())

print(f"입력하신 숫자는 {a}, {b}, {c}입니다.")

prize = 0
x = 0
input = [a,b,c]
input_clean = list(set(input))

if len(input_clean) == 1:
    prize = 10000 + (a * 1000)
elif len(input_clean) == 3:
    prize = max(list1) * 100
else:
    if ( a == b ) or ( a == c ):
        a = x
        prize = x * 100
    else:
        b = x
        prize = x * 100


print(f'상금은 {prize}원 입니다.')

[사용한 파이썬 문법]
1. 조건문 (if-elif-else)
2. 리스트와 세트 자료구조
3. f-문자열 (f-string)
4. 내장 함수 (int(), input(), max(), set(), list())

[트러블슈팅 및 개선]
처음에 코드를 작성할 때는 단순히 문제 해결에만 초점을 맞췄다. 그러다보니 최초 작성한 코드를 리뷰하는 과정에서 아래와 같은 이슈를 발견했다.

(1) 입력 검증 문제:
각 주사위 눈을 입력받을 때마다 같은 코드를 반복해서 썼다. 비효율적인 코드 같아 개선 방법을 찾다가 입력 받는 부분을 함수로 만들어봤다. 이렇게 하니까 코드가 더욱 짧아졌다.

(2) 상금 계산 로직 오류:
처음에는 두 개의 눈이 같은 경우를 제대로 처리하지 못했다. 이 부분을 고치면서 알고리즘을 전체적으로 다시 생각해봤다. 결국 set을 활용해서 중복을 제거하고, 각 경우를 명확하게 구분해서 처리하는 방식으로 개선했다.

[인사이트]
(1) 함수의 활용:
코드를 함수로 나누니까 전체 구조가 훨씬 깔끔해졌다. 특히 입력 받는 부분과 상금 계산 부분을 분리하니까 각 부분을 독립적으로 수정하기 쉬워졌다. 앞으로 코딩할 때 기능별로 함수를 만드는 습관을 들여야겠다.

(2) 예외 처리의 중요성:
사용자가 올바른 입력만 하지는 않을 테니 잘못된 입력을 처리하는 코드를 추가했고 그렇게 하니 프로그램이 훨씬 안정적으로 동작했다. 사용자 입력을 받을 때는 항상 예외 상황을 고려해야 한다.

(3) 파이썬 내장 기능의 활용:
set(), count(), max() 같은 내장 함수들을 활용하니까 코드가 훨씬 간결해졌다. 특히 set()으로 중복을 제거하는 아이디어가 문제 해결에 큰 도움이 됐다. 파이썬의 다양한 내장 기능들을 더 공부하고 편하게 사용할 수 있도록 여러 번 연습해야겠다는 생각이 들었다.

[최종 코드]

def get_valid_dice_input():
    while True:
        try:
            n = int(input())
            if 1 <= n <= 6:
                return n
            print("1부터 6까지의 숫자만 입력 가능합니다.")
        except ValueError:
            print("올바른 숫자를 입력해주세요.")

def calculate_prize(dice):
    if len(set(dice)) == 1:
        return 10000 + (dice[0] * 1000)
    elif len(set(dice)) == 2:
        for d in dice:
            if dice.count(d) == 2:
                return 1000 + (d * 100)
    else:
        return max(dice) * 100

print("주사위 3개의 눈을 입력하세요:")
dice = [get_valid_dice_input() for _ in range(3)]
print(f"입력한 눈: {dice[0]}, {dice[1]}, {dice[2]}")

prize = calculate_prize(dice)
print(f'상금: {prize}원')