Python에는 세 가지 종류의 내장 숫자형이 있어요: ints, floats, complex. 하지만 이 연습 문제에서는 ints와 floats만 다뤄요.
ints는 정수예요. 예를 들어 1234, -10, 20201278 같은 숫자예요.
Python의 정수는 임의 정밀도를 지원해요. 즉, 자릿수는 호스트 시스템에서 사용할 수 있는 메모리에 의해서만 제한돼요.
floats는 소수점을 포함하는 숫자예요. 예를 들어 0.0, 3.14, -9.01 같은 숫자예요.
실수는 보통 Python에서 C의 double을 사용해 구현되는데(정밀도는 _소수점 이하 15자리_예요), 표현 방식은 호스트 시스템과 그 밖의 구현 세부 사항에 따라 달라져요. 이 때문에 실수를 다룰 때 예상치 못한 일이 생기기도 하지만, 대부분의 상황에서는 "충분히 괜찮아요".
더 자세한 내용과 논의는 다음 자료에서 볼 수 있어요:
Python은 ints와 floats 사이의 산술 연산을 완벽하게 지원해요. 이항 산술 연산자(+, -, *, /, //, %)를 사용할 때는 더 좁은 숫자를 더 넓은 숫자에 맞춰 변환해요.
Python은 ints가 floats보다 좁다고 봐요. 그래서 식에 실수를 사용하면 결과도 실수가 돼요. 하지만 나눗셈을 할 때는 정수만 사용하더라도 결과가 항상 실수가 돼요.
# The int is widened to a float here, and a float type is returned.
>>> 3 + 4.0
7.0
>>> 3 * 4.0
12.0
>>> 3 - 2.0
1.0
# Division always returns a float.
>>> 6 / 2
3.0
>>> 7 / 4
1.75
# Calculating remainders.
>>> 7 % 4
3
>>> 2 % 4
2
>>> 12.75 % 3
0.75
정수 결과가 필요하면 //를 사용해 결과를 잘라낼 수 있어요.
>>> 6 // 2
3
>>> 7 // 4
1
실수를 정수로 변환하려면 int()를 사용하면 돼요. 정수를 실수로 변환하려면 float()를 사용하면 돼요.
>>> int(6 / 2)
3
>>> float(1 + 2)
3.0
친구 Chandler는 세계 곳곳의 이국적인 나라들을 여행할 계획이에요. 안타깝게도 Chandler는 수학 실력이 좋지 않아요. 그는 여행 중에 환전소에서 바가지를 쓸까 봐 꽤 걱정하고 있어요. 그래서 여러분에게 환율 계산기를 만들어 달라고 해요. 다음은 그가 앱에 원하는 사양이에요.
매개변수 2개를 받는 exchange_money() 함수를 만들어요:
budget : 환전할 예정인 금액.exchange_rate : 외화 1단위에 해당하는 자국 통화의 금액.이 함수는 환전한 통화의 가치를 반환해야 해요.
참고: 사용하는 통화가 USD이고 환율 1.20으로 USD를 EUR로 환전하려면 1.20 USD == 1 EUR예요.
>>> exchange_money(127.5, 1.2)
106.25
매개변수 2개를 받는 get_change() 함수를 만들어요:
budget : 환전 전 금액.exchanging_value : 환전을 위해 예산에서 빠지는 금액.이 함수는 예산에서 남는 금액을 반환해야 해요.
>>> get_change(127.5, 120)
7.5
매개변수 2개를 받는 get_value_of_bills() 함수를 만들어요:
denomination : 지폐 한 장의 가치.number_of_bills : 지폐의 총 개수.이 환전소는 정해진 단위의 현금만 취급해요. 받게 되는 총액은 "지폐" 한 장, 즉 1단위의 가치로 나누어떨어져야 하는데, 그러면 소수나 나머지가 남을 수 있어요. 이 함수는 환전소가 돌려주는 지폐의 총 가치(소수 부분은 제외)만 반환해야 해요. 안타깝게도 환전소는 그 나머지나 거스름돈을 덤으로 가져가요.
>>> get_value_of_bills(5, 128)
640
amount와 denomination을 받는 get_number_of_bills() 함수를 만들어요.
이 함수는 주어진 금액 안에서 받을 수 있는 _지폐 개수_를 반환해야 해요. 다시 말해, 시작 금액 안에 _온전한 지폐_가 몇 장 들어가나요? 받을 수 있는 건 _온전한 지폐_뿐이고 지폐의 일부는 받을 수 없으니, 그에 맞게 나눠야 해요. 결국 가장 가까운 정수 지폐, 즉 지폐 단위로 _내림_하는 셈이에요.
>>> get_number_of_bills(127.5, 5)
25
amount와 denomination을 받는 get_leftover_of_bills() 함수를 만들어요.
이 함수는 지폐 단위가 정해졌을 때 시작 _금액_에서 돌려받을 수 없는 _남은 금액_을 반환해야 해요. 환전소가 정확히 얼마를 가져가는지 아는 것은 아주 중요해요.
>>> get_leftover_of_bills(127.5, 20)
7.5
budget, exchange_rate, spread, denomination을 받는 exchangeable_value() 함수를 만들어요.
spread 매개변수는 환전 수수료로 떼어 가는 비율이며, 정수로 표기해요.
이 값은 100으로 나누어 소수로 변환해야 해요.
1.00 EUR == 1.20 USD이고 spread가 10이면 실제 환율은 1.00 EUR == 1.32 USD가 돼요. 1.20의 10%는 0.12이고, 이 추가 수수료가 환율에 더해지기 때문이에요.
이 함수는 환율에 spread를 더해 계산한 뒤, 새 통화의 최댓값을 반환해야 해요. 통화의 지폐 단위는 정수이고 더 나눌 수 없다는 점을 기억해요.
참고: 반환되는 값은 int 타입이어야 해요.
>>> exchangeable_value(127.25, 1.20, 10, 20)
80
>>> exchangeable_value(127.25, 1.20, 10, 5)
95
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.