트랙
/
Python
Python
/
연습 문제
/
전기 요금
전기 요금

전기 요금

학습 연습 문제

소개

Python에는 세 가지 종류의 내장 숫자 타입이 있어요: 정수(int), 실수(float), 복소수(complex). 분수(fractions.Fraction)와 십진수(decimal.Decimal)도 표준 라이브러리에서 import해 사용할 수 있어요.

소수점이 없는 16진수(hex()), 8진수(oct()), 2진수(bin())를 포함한 모든 정수도 ints로 식별돼요:

# Ints are whole numbers.
>>> 1234
1234
>>> type(1234)
<class 'int'>

>>> -12
-12

소수점을 포함하는 숫자(소수 부분이 있든 없든)는 floats로 식별돼요:

>>> 3.45
3.45
>>> type(3.45)
<class 'float'>

산술

Python은 이러한 여러 숫자 타입 간의 산술 연산을 완전히 지원하며, 이항 산술 연산자(+, -, *, /, //, %)와 함께 사용할 때 더 좁은 숫자를 더 넓은 숫자에 맞춰 변환해요.

덧셈과 뺄셈

덧셈과 뺄셈 연산자는 일반 수학에서처럼 동작해요. 피연산자 중 하나 이상이 float이면 나머지 int도 float로 변환돼요:

>>> 5 - 3
2
# The int is widened to a float here, and a float is returned.
>>> 3 + 4.0
7.0

곱셈

덧셈과 뺄셈에서처럼, 곱셈도 더 좁은 숫자를 더 넓은 숫자에 맞춰 변환해요:

>>> 3 * 2
6

>>> 3 * 2.0
6.0

나눗셈

나눗셈은 결과가 정수라도 항상 float을 반환해요:

>>> 6/5
1.2

>>> 6/2
3.0

내림 나눗셈

int 결과가 필요하면 내림 나눗셈을 사용해 결과를 버림할 수 있어요. 내림 나눗셈은 // 연산자로 수행해요:

>>> 6//5
1

>>> 6//2
3

나머지 연산

나머지 연산자(%)는 두 피연산자를 나눈 나머지를 반환해요:

# The result of % is zero here, because dividing 8 by 2 leaves no remainder
>>> 8 % 2
0

# The result of % is 2 here, because 3 only goes into 5 once, with 2 leftover
>>> 5 % 3
2

5 % 3을 다른 방식으로 살펴보면 이래요:

>>> whole_part = int(5/3)
1

>>> decimal_part = 5/3 - whole_part
0.6666666666666667

>>> whole_remainder = decimal_part * 3
2.0

반올림

Python은 실수를 지정한 소수 자릿수로 반올림하는 내장 함수 round(number, <decimal_places>)를 제공해요. 소수 자릿수를 지정하지 않으면 가장 가까운 정수로 반올림하고 int를 반환해요:

>>> round(3.1415926535, 2)
3.14

>>> round(3.1415926535)
3

우선순위와 괄호

Python에서는 괄호를 사용해 식을 묶을 수 있어요. 기본 연산 순서를 바꾸고 싶을 때 유용해요.

>>> 2 + 3 * 4
14

>>> (2 + 3) * 4
20

Python은 연산자 우선순위에 PEMDAS 규칙을 따라요. 즉 () 안의 계산이 가장 우선이고, 그다음 **, 그다음 *, /, //, %, +, - 순서예요:

>>> 2 + 3 - 4 * 4
-11

>>> (2 + 3 - 4) * 4
4

# In the following example, the `**` operator has the highest priority, then `*`, then `+`
# Meaning we first do 4 ** 4, then 3 * 64, then 2 + 192
>>> 2 + 3 * 4 ** 4
770

정밀도와 표현

Python의 정수는 임의 정밀도를 가져요. 즉, 자릿수는 호스트 시스템에서 사용할 수 있는 메모리에 의해서만 제한돼요.

실수는 보통 C의 double을 사용해 구현되지만(소수점 이하 15자리 정밀도), 표현 방식은 호스트 시스템에 따라 달라요. 복소수는 real 부분과 imaginary 부분을 가지며, 둘 다 실수로 표현돼요.

여러 프로그래밍 언어에서 실수 연산이 가지는 문제와 한계에 대한 더 자세한 논의는 0.30000000000000004.com과 The Python Tutorial을 참고해요.

지침

다니는 회사는 탄소 발자국을 줄이고 싶어 해요. 그래서 전자 기기를 돌리는 데 드는 전력 사용량과 비용을 계산하는 프로그램을 작성해 달라고 해요.

1. 추가 시간 구하기

고용주에게는 여러 전자 기기를 돌리는 데 걸리는 시간을 계산하는 프로그램이 있어요. 현재 이 시간은 시간 단위로 저장돼요. 고용주가 시간을 더해 보니, 시간 길이가 맞지 않는다는 걸 알게 됐어요. 그래서 시간 데이터에 3시간을 추가로 더하기를 원해요. 또 데이터를 "완전한 하루"로 변환하고 나면 "추가" 시간이 몇 시간인지도 알고 싶어 해요 (하루는 24시간이에요). 변환할 시간이 꼭 완전한 하루 단위가 아닐 수도 있어요.

시간 수를 담은 정수를 매개변수로 받는 get_extra_hours() 함수를 구현해요. 이 함수는 "추가" 시간을 알맞게 조정한 다음, 전체에서 몇 시간을 빼야 "완전한 하루" 단위의 시간이 되는지를 나타내는 정수를 return해야 해요.

>>> get_extra_hours(25)
4

2. kW 값 구하기

고용주는 여러 전자 기기의 전력 사용량을 kW로 알고 싶어 해요. kW는 킬로와트를 뜻하고, 와트는 전력의 단위예요. 단위 이름에서 킬로는 미터법에서 1000을 뜻하는 접두사예요. 1킬로와트 == 1000와트예요.

와트 수를 담은 정수를 매개변수로 받는 get_kW_value() 함수를 구현해요. 이 함수는 와트를 소수점 첫째 자리에서 반올림한 킬로와트로 return해야 해요.

>>> get_kW_value(1150)
1.2

3. kWh 값 구하기

전자 기기를 돌리는 비용을 계산하려면 고용주가 kWh 단위의 전력 사용량을 알아야 해요. kWh는 킬로와트시를 뜻하고, 여기서 시는 시간의 단위예요. 1킬로와트시 == 1시간 동안 사용한 1000와트예요. 1시간은 60분으로, 1분은 60초로 이루어져 있어요. 1시간은 3600초예요. kWh 값을 계산하려면 와트를 kW로 변환한 다음, 그 결과를 3600으로 내림 나눗셈해야 해요.

와트 수를 담은 정수를 매개변수로 받는 get_kWh_value() 함수를 구현해요. 이 함수는 킬로와트시를 정수로 return해야 해요.

>>> get_kWh_value(5000000)
1

4. 효율 구하기

전자 기기는 100% 효율적이지 않아요. 그래서 고용주는 전자 기기의 _효율_을 계산해 달라고 해요. 효율을 구하려면 역률(0과 100 사이의 실수)을 100으로 나눠야 해요.

역률을 담은 실수를 매개변수로 받는 get_efficiency() 함수를 구현해요. 이 함수는 계산된 효율을 실수로 return해야 해요.

>>> get_efficiency(80)
0.8

5. 비용 구하기

고용주는 전자 기기를 돌리는 비용을 알고 싶어 해요. 전자 기기를 돌리는 비용은 사용한 전력에 kWh당 비용을 곱한 값이에요. 사용한 전력은 주어진 전력을 계산된 효율로 나눈 값이에요.

와트 수를 담은 정수, 역률을 담은 실수, kWh당 비용을 담은 실수를 매개변수로 받는 get_cost(<watts>,<power_factor>,<price>) 함수를 구현해요. 이 함수는 전자 기기를 돌리는 비용을 실수로 return해야 해요.

>>> get_cost(5000000, 80, 0.25)
0.3125
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Python Exercism

전기 요금 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.