- 시간 제한: 2초 (72ms)
- 메모리 제한: 128MB (30840KB)
문제
동호는 새악대로 T 통신사의 새 핸드폰 옴머나를 샀다. 새악대로 T 통신사는 동호에게 다음 두 가지 요금제 중 하나를 선택하라고 했다.
- 영식 요금제
- 민식 요금제
영식 요금제는 30초마다 10원씩 청구된다. 이 말은 만약 29초 또는 그 보다 적은 시간 통화를 했으면 10원이 청구된다. 만약 30초부터 59초 사이로 통화를 했으면 20원이 청구된다.
민식 요금제는 60초마다 15원씩 청구된다. 이 말은 만약 59초 또는 그 보다 적은 시간 통화를 했으면 15원이 청구된다. 만약 60초부터 119초 사이로 통화를 했으면 30원이 청구된다.
동호가 저번 달에 새악대로 T 통신사를 이용할 때 통화 시간 목록이 주어지면 어느 요금제를 사용 하는 것이 저렴한지 출력하는 프로그램을 작성하시오.
입력
동호가 저번 달에 이용한 통화의 개수 N이 주어진다. N은 20보다 작거나 같은 자연수이다. 둘째 줄에 통화 시간 N개가 주어진다. 통화 시간은 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 싼 요금제의 이름을 출력한다. 그 후에 공백을 사이에 두고 요금이 몇 원 나오는지 출력한다. 만약 두 요금제의 요금이 모두 같으면 영식을 먼저 쓰고 민식을 그 다음에 쓴다.
영식은 Y로, 민식은 M으로 출력한다.
import sys
n = int(sys.stdin.readline())
m = list(map(int, sys.stdin.readline().split()))
def y_cost(m):
if m < 30:
cost = 10
else:
cost = m//30*10+10
return cost
def m_cost(m):
if m < 60:
cost = 15
else:
cost = m//60*15+15
return cost
y_sum = 0
m_sum = 0
for i in range(n):
y_sum += y_cost(m[i])
m_sum += m_cost(m[i])
if y_sum == m_sum:
print('Y', 'M', y_sum)
elif y_sum < m_sum:
print('Y', y_sum)
else:
print('M', m_sum)
풀이
통화의 개수 N / 통화 시간 N개 (list m)
여기서 헷갈리지 않아야 할 점은, 통화의 총 합이 아닌 각각 통화의 요금을 더해서 계산해야 한다는 것이다.
영식/민식 요금제에서 각 통화시간에 대한 요금을 return하는 함수를 이용한다.
n개의 통화 요금의 합에 대해 영식/민식 중 최소값을 찾아 출력한다.
+ 코드 줄이기
import sys
n = int(sys.stdin.readline())
m = list(map(int, sys.stdin.readline().split()))
y_cost = 0
m_cost = 0
for i in m:
y_cost += i//30*10+10
m_cost += i//60*15+15
if y_cost > m_cost:
print('M', m_cost)
elif y_cost < m_cost:
print('Y', y_cost)
else:
print('Y', 'M', y_cost)
영식/민식 요금을 따로 구하지 않고, 하나의 for문에 집어넣어서 같이 구할 수 있었다..ㅎㅎ
그리고 list 원소를 순차진행하는 for문은 range() 함수를 쓸 필요가 없이, for list로 쓰면 된다.
항상 더 효율적이고 간결한 코드를 작성하자!
'👩🏻💻 Front-end > 👾 Algorithm' 카테고리의 다른 글
백준 1032 - 명령 프롬프트 (Python) (0) | 2022.04.23 |
---|---|
백준 1598 - 꼬리를 무는 숫자 나열 (직각거리 구하기) (Python) (0) | 2022.04.20 |
백준 1212 - N개의 정수의 합 S의 부호 구하기 (Python) (0) | 2022.04.20 |
백준 1212 - 8진수를 2진수로 변환 (Python) (0) | 2022.04.19 |
백준 1085 - 직사각형에서 탈출 (Python) (0) | 2022.04.18 |