딕셔너리를 이용해서 코딩하기(1): 거스롬돈 계산 문제 - fromkeys()

소환인·2023년 10월 4일
0

파이썬

목록 보기
1/8

파이썬을 다시 공부하며 한 가지 문제를 여러가지 방식으로 풀어보려고 시도하고 있다.
첫번째 포스팅은 파이썬을 공부하며 기초단계에서 나오는 연습문제인 '거스롬돈 계산하기'다.

예시로 사용하는 문제는 '제로베이스 스쿨''파이썬 기초 문제풀이' 강의에서 가져왔다.

문제정의

  • 상품가격과 지불금액을 입력하면 거스름돈을 계산하는 프로그램
  • 거스름돈은 지폐와 동전의 개수를 최소로 하고, 1원 단위는 절사
  • 지폐 : 50,000원, 10,000원, 5,000원, 1,000원
    동전 : 500원, 100원, 10원

딕셔너리를 활용해서 문제를 풀기 전에, if문을 활용해서 먼저 코딩을 해보고 딕셔너리를 사용한 풀이와 비교해보자.

if문을 이용한 풀이

# 상품가격과 지불금액 입력
price = int(input('상품 가격 입력 : '))
payment = int(input('지불 금액 : '))

# 지불금액이 상품가격보다 큰 지 확인
# % 연산자를 활용해서 1원 단위 절사
if payment >= price:
    change = (payment - price) - (payment - price) % 10
else:
    print('금액이 부족합니다.')
    change = payment

print('거스름 돈 : {}(원단위 절사)'.format(change))
print('-'*25)

change50000 = 0
change10000 = 0
change5000 = 0
change1000 = 0
change500 = 0
change100 = 0
change10 = 0

# if문을 활용해서 거스름돈을 계산
if change // 50000 > 0:
    change50000 = change // 50000
    change = change - 50000 * change50000
if change // 10000 > 0 and change // 10000 < 5:
    change10000 = change // 10000
    change = change - 10000 * change10000
if change // 5000 > 0 and change // 5000 < 2:
    change5000 = change // 5000
    change = change - 5000 * change5000
if change // 1000 > 0 and change // 1000 < 10:
    change1000 = change // 1000
    change = change - 1000 * change1000
if change // 500 > 0 and change // 500 < 2:
    change500 = change // 500
    change = change - 500 * change500
if change // 100 > 0 and change // 100 < 10:
    change100 = change // 100
    change = change - 100 * change100
if change // 10 > 0 and change // 10 < 10:
    change10 = change // 10
    change = change - 10 * change10

# f-string을 활용해서 결과 출력하기
print(f'50,000원 - {change50000}장')
print(f'10,000원 - {change10000}장')
print(f'5,000원\t - {change5000}장')
print(f'1,000원\t - {change1000}장')
print(f'500원\t - {change500}장')
print(f'100원\t - {change100}장')
print(f'10원\t - {change10}장')

print('-'*25)

보통 if조건문의 활용을 위해 예제로 사용되는 문제인만큼 if문이 반복해서 사용되는 풀이가 보통이다. 위의 코드에서 if문이 반복되어 사용되고 있다. 조건식이 여러개인데 왜 if-elif를 사용하지 않고 if만 사용할까? if-elif를 사용하게 되면 여러개의 조건식 중 만족하는 첫번째 조건을 찾고 해당 조건의 실행문만 실행하고 나머지 elif문을 건너뛰게 된다. 위의 코드에선, 단위가 큰 지폐부터 하나씩 체크하며 다음단계로 넘어가는 식으로 풀이하고 있기 때문에 elif를 사용하게 되면 엉뚱한 답을 얻게 된다.

위의 코드는 그냥 보기만 해도 비슷한 코드가 반복되고 있어서 실수가 나오기 좋고, 가독성도 좋지 않다. 추후 코드의 유지 보수에도 좋지 않다. 이번에는 딕셔너리를 활용해서 코딩을 해보자.

딕셔너리를 이용한 풀이

# 상품가격과 지불금액 입력
price = int(input('상품 가격 입력 : '))
payment = int(input('지불 금액 : '))

# 거스름돈 계산 & 1원 단위 절사
change = (payment - price) - (payment - price) % 10

print('거스름 돈 : {}(원단위 절사)'.format(change))
print('-'*25)

# 거스름돈 단위를 리스트로 저장
units = [50000, 10000, 5000, 1000, 500, 100, 10]

# 거스름돈을 딕셔너리로 저장
changes = dict.fromkeys(units, 0)

# for문을 활용해서 거스롬돈(change)을 어떻게 지불해야 하는지 계산
for unit in units:
    count, change = divmod(change, unit)
    changes[unit] = count

print('-'*25)

# for문과 딕셔너리를 활용해서 출력
for unit, change in changes.items():
    print(f"{format(unit, ',')}원 - {change}장")

print('-'*25)

코드가 훨씬 짧아졌고 그만큼 가독성도 좋아졌다. 입력을 받는 부분은 똑같다. 거스름돈 단위를 리스트로 저장하고, 거스름돈을 어떻게 지불해야 하는지를 딕셔너리로 저장하는 부분이 달라졌다. 필요한 데이터를 리스트, 딕셔너리로 관리하면 여러부분에서 편리해진다.

dict.fromkeys(키, 초기값) 메서드는 딕셔너리를 생성해주는 메서드다. 첫번째 입력받는 인자를 키로, 두번째 입력받는 인자를 밸류로 하는 딕셔너리를 생성한다. 위의 코드에선 리스트로 저장한 거스름돈 단위를 키로, 그리고 모든 밸류를 0으로 지정해서 딕셔너리를 생성했다.

거스름돈 계산에 필요한 자료들을 리스트와 딕셔너리로 지정해 주었기 때문에 for문을 활용해서 간편하게 거스름돈을 계산하고 출력을 할 수 있다. divmod로 몫과 나머지를 구하는 부분은 첫번째 풀이에서 if문이 계산하는 부분과 같다. divmod로 계산한 결과를 바탕으로 딕셔너리의 밸류들을 수정한다.

개인적으로 리스트나 튜플에 비해 딕셔너리를 활용하는게 익숙하지 않은데, (키, 밸류) 쌍으로 데이터를 관리할 수 있다는 건 여러모로 편리한 부분이 많아서 활용가치가 높다.

profile
돌고돌아

0개의 댓글