공부/파이썬

코드정리 - 거스름돈 구하기

taegeun 2021. 5. 6. 22:04
def calculate_change(payment, cost):
    # 코드를 작성하세요.
    
    a = int((payment - cost) / 50000)
    b = int((payment - cost - (50000 * a)) / 10000)
    c = int((payment - cost - (50000 * a + 10000 * b))/ 5000)
    d = int((payment - cost - (50000 * a + 10000 * b + 5000 * c))/ 1000)
    print(f"50000원 지폐: {a}장")
    print(f"10000원 지폐: {b}장")
    print(f"5000원 지폐: {c}장")
    print(f"1000원 지폐: {d}장")

# 테스트
calculate_change(100000, 33000)
print()
calculate_change(500000, 378000)

오늘은 코드잇에서 파이썬을 배웠다.

c++의 기초정도만 학교에서 배운 상태에서 파이썬을 처음 배우는 건데

내 실력 덕분이라기보다 코드잇의 내용이 너무 쉽다고 느꼈다.

 

하지만 오늘 문제를 풀어보면서 코드가 너무 지저분하여 어거지로 맞춘 느낌이 들어

이를 좀 더 깔끔하게 정리하는 과정을 기록하려고 한다.

 

위의 코드는 거스름돈의 갯수를 구하는 코드이다.

보다시피 무척 더럽다 이를 어떻게 깔끔하게 정리할수 있을까?

 

change = payment - cost

 

우선 payment - cost 가 반복되면서 지저분해보이니 새로운 변수 change를 선언하여 이를 대체하면

 

def calculate_change(payment, cost):
    # 코드를 작성하세요.
  
    change = payment - cost
    
    a = int(change / 50000)
    b = int((change - (50000 * a)) / 10000)
    c = int((change - (50000 * a + 10000 * b))/ 5000)
    d = int((change - (50000 * a + 10000 * b + 5000 * c))/ 1000)
    print(f"50000원 지폐: {a}장")
    print(f"10000원 지폐: {b}장")
    print(f"5000원 지폐: {c}장")
    print(f"1000원 지폐: {d}장")

# 테스트
calculate_change(100000, 33000)
print()
calculate_change(500000, 378000)

음 조금 나아졌지만 스파게티는 그대로이다. 

 

여기서 새롭게 배운 개념이 있는데 바로 버림 나눗셈이다. 기호로는 //라고 한다.

이는 나눗셈을 하고 소숫점부분은 모두 버리는 연산자이다.

 

위의 기호를 쓴다면 int() 부분을 모두 대체할수있을것이다.

 

def calculate_change(payment, cost):
    # 코드를 작성하세요.
  
    change = payment - cost
    
    a = change // 50000
    b = change - (50000 * a) // 10000
    c = change - (50000 * a + 10000 * b) // 5000
    d = change - (50000 * a + 10000 * b + 5000 * c) // 1000
    print(f"50000원 지폐: {a}장")
    print(f"10000원 지폐: {b}장")
    print(f"5000원 지폐: {c}장")
    print(f"1000원 지폐: {d}장")

# 테스트
calculate_change(100000, 33000)
print()
calculate_change(500000, 378000)

 음 좋다 한번 테스트해보자

엇 뭔가 이상하다.

 

50000만원 연산은 문제없는것으로 보아 change - () 밖의 괄호까지 없앤것이 문제인듯하다 필요한 괄호를 넣자

 

def calculate_change(payment, cost):
    # 코드를 작성하세요.
  
    change = payment - cost
    
    a = change // 50000
    b = (change - (50000 * a)) // 10000
    c = (change - (50000 * a + 10000 * b)) // 5000
    d = (change - (50000 * a + 10000 * b + 5000 * c)) // 1000
    print(f"50000원 지폐: {a}장")
    print(f"10000원 지폐: {b}장")
    print(f"5000원 지폐: {c}장")
    print(f"1000원 지폐: {d}장")

# 테스트
calculate_change(100000, 33000)
print()
calculate_change(500000, 378000)

 이제 잘되는 듯하다 마지막으로 change 뒤의 계산 부분을 최적화 할수 없을까?

 

d를 예를 들면

d = (change - (50000 * a + 10000 * b + 5000 * c)) // 1000

인데 어차피 목적은 앞의 단위로 계산 후 나머지를 해당 변수의 단위로 나눈 몫을 구하는 것이다.

그렇다면 (50000 * a + 10000 * b + 5000 * c)으로 나머지를 구하는 대신 % 연산자를 활용해보자

 

위에서 ()의 제거하고 다시 없애는 과정이 불필요해졌지만 한번에 뭐가 되면 인생이 재미가 없다

 

def calculate_change(payment, cost):
    # 코드를 작성하세요.
  
    change = payment - cost
    
    a = change // 50000
    b = change % 50000 // 10000
    c = change % 10000 // 5000
    d = change % 5000 // 1000
    print(f"50000원 지폐: {a}장")
    print(f"10000원 지폐: {b}장")
    print(f"5000원 지폐: {c}장")
    print(f"1000원 지폐: {d}장")

# 테스트
calculate_change(100000, 33000)
print()
calculate_change(500000, 378000)

그래 이거다. change는 변수임으로 앞의 계산이 그대로 적용되어서 복잡한 사칙연산을 쉽게 나타낼수있었다.

 

코드잇의 강의 난이도가 생각보다 낮아서 실망스러웠지만 이렇게 세세한 기초를 다지기에는 좋은 듯하다.

자만하지말고 좋은 함수들을 많이 써보면서 항상 배우는 자세를 가지자