파이썬을 다시 공부하며 한 가지 문제를 여러가지 방식으로 풀어보려고 시도하고 있다.
첫번째 포스팅은 파이썬을 공부하며 기초단계에서 나오는 연습문제인 '거스롬돈 계산하기'다.
예시로 사용하는 문제는 '제로베이스 스쿨'의 '파이썬 기초 문제풀이' 강의에서 가져왔다.
딕셔너리를 활용해서 문제를 풀기 전에, 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
로 계산한 결과를 바탕으로 딕셔너리의 밸류들을 수정한다.
개인적으로 리스트나 튜플에 비해 딕셔너리를 활용하는게 익숙하지 않은데, (키, 밸류) 쌍으로 데이터를 관리할 수 있다는 건 여러모로 편리한 부분이 많아서 활용가치가 높다.