파이썬으로 구현한 화폐 매수 계산 알고리즘의 예

이 포스트에서는 파이썬으로 화폐 매수 계산 알고리즘을 구현한 예를 소개합니다.

개정되기 전의 정보처리기사 실기 문제 중에 화폐 매수 계산 알고리즘을 구현하는 문제가 있었습니다. 여기서는 이 알고리즘을 약간 다른 형태로 구현해 보았습니다. 코드는 다음과 같습니다.

bill_unit = [50000, 10000, 5000, 1000, 500, 100, 50, 10]

s = input("Amount of money (KRW): ")
try:
	m = int(float(s) / 10) * 10
	tm = m
	print("%s Won" % ("{:,}".format(m) ) )
	print("=" * 30)
	for x in bill_unit:
		y = tm // x
		print (" %s Won:" % ("{:>6,}".format(x) ), end="	")
		print ("%3d" % y, end="	")
		print ("%s" % "{:>10,}".format(y * x) )
		tm -= y * x
	print("-" * 30)
	print(" " * 8 + "Sum:" + " " * 7, end="")
	print("{:>10,}".format(m) )
	print("=" * 30)
except ValueError:
	print("Invalid value.")

우선 1번째 줄에서 화폐의 액면 단위를 배열로 정의합니다. 가장 큰 단위로 나눈 후 나머지는 단위를 하나씩 줄이면서 나누는 방식으로 하기 때문에 액면가의 숫자가 큰 순서대로 정의됩니다.

그 다음으로 4번째 줄에서 액수를 입력할 문자열 변수를 입력받습니다. 그리고 5번째 줄에서는 이 문자열 변수를 부동소수형으로 바꾼 후 10을 나눈 값을 정수화하여 다시 10을 곱합니다. 이렇게 되면 10의 자리까지만 남고 1의 자리와 소수점 이하는 버려집니다. 만약 잘못된 값을 입력할 경우 20번 줄로 넘어가 오류 메시지를 출력하고 끝냅니다.

6번 줄에서는 5번 줄에서 변환한 값을 임시 변수로 복사합니다. 그리고 그 값을 7번 줄에서 입력한 돈의 액수를 3자리마다 쉼표로 출력되는 형식의 문자열로 변환한 상태로 출력하고 8번 줄에서는 등호를 30개 써서 가로선을 그립니다.

이제 9번 줄에서는 1번 줄에 정의된 액면 배열에 맞춰 반복합니다. x는 액면 배열의 값이 앞에서부터 차례로 들어갑니다. 복사된 임시 변수를 x로 나누고 소수점 이하는 버린 값을 y에 대입하는데 이것이 바로 그 화폐의 매수가 됩니다. 그리고 액면가를 출력한 후 그 다음 그 화폐의 매수와 그를 곱한 값을 출력합니다. 여기서 "{:>6,}".format(x)는 x의 값을 3자리마다 쉼표를 찍은 문자열로 하고 6자 길이를 기준으로 오른쪽 정렬하게 하는 형식으로 합니다. 출력 후 매수(y)와 액면(x)을 곱한 값을 임시 변수에서 빼고 다음으로 넘어갑니다. 그러면 나머지 값에 대해 한 단계 낮은 단위로 매수를 계산하고 이런 식으로 마지막(10원)까지 계속 반복됩니다.

그리고 반복이 끝났으면 15번 줄로 넘어가 가로선을 또 긋고 합계액을 출력한 다음 마지막으로 또 가로선을 긋고 끝냅니다.

이 프로그램의 결과는 다음과 같습니다.

Amount of money (KRW): 1427770
1,427,770 Won
==============================
 50,000 Won:   28   1,400,000
 10,000 Won:    2      20,000
  5,000 Won:    1       5,000
  1,000 Won:    2       2,000
    500 Won:    1         500
    100 Won:    2         200
     50 Won:    1          50
     10 Won:    2          20
------------------------------
        Sum:        1,427,770
==============================

예를 들어서 위와 같이 1427770으로 입력했다면 일단 “1,427,770원”으로 표시한 다음 이를 5만원권 28장(1,400,000원)으로 계산하고 남은 27,770원은 1만원권 2장(20,000원 / 합계 1,420,000원), 5천원권 1장(5,000원 / 합계 1,425,000원), 1천원권 2장(2,000원 / 합계 1,427,000원) … 이렇게 해서 10원까지 계산하고 나면 합계액이 입력한 금액인 1,427,770원에 도달하게 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다.