- 문제
- 풀이
#include <iostream>
using namespace std;
int n, input, y_total, m_total;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> input;
// 각 통화 시간에 대해 영식 요금제와 민식 요금제를 개별적으로 계산
y_total += (input / 30 + 1) * 10; // 영식 요금제 요금 계산
m_total += (input / 60 + 1) * 15; // 민식 요금제 요금 계산
}
if (y_total < m_total) cout << "Y " << y_total;
else if (m_total < y_total) cout << "M " << m_total;
else cout << "Y M " << y_total;
return 0;
}
- 메모
각 통화 시간에 대해서 2개의 요금제에 대해서 개별적으로 요금을 계산해야 한다는 점에 주의해야 한다.
또한 요금을 계산할 때 (input / 30 + 1)에서 +1을 해주는 이유는 통화 시간이 요금제의 시간 단위로 나누어 떨어지지 않는 경우 남은 초에 대해서도 요금이 추가로 청구되기 때문이다.
아예 요금제의 시간 단위보다 작은 값만 입력되는 경우도 있을 수 있는데, 나누기 연산의 결과 몫이 0이 되기 때문에 이 경우 한 번의 요금제 사이클에 대한 값이 계산되지 않게 된다. 따라서 최소한의 요금을 계산하기 위해서는 + 1을 해줘야 한다.
자세한 예시는 아래와 같다.
예시
- 통화 시간이 29초일 때:
- input / 30의 몫은 0이다.
- 그러나 요금은 30초 단위로 계산되므로 최소 10원이 청구된다.
- 따라서 (29 / 30 + 1) * 10이 되어 10원이 청구된다.
- 통화 시간이 45초일 때:
- input / 30의 몫은 1이다.
- 그러나 45초는 30초를 초과하므로 두 번째 요금 단위가 적용되어야 한다.
- (45 / 30 + 1) * 10이 되어 20원이 청구된다.
- 통화 시간이 정확히 30초, 60초일 때도 동일하게 처리:
- 예를 들어, 30초는 (30 / 30 + 1) * 10으로 20원이 청구된다.
- 이렇게 하면 시간 단위마다 요금을 추가로 계산하게 된다.
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[백준/3273번/C++] 두 수의 합 (0) | 2024.10.28 |
---|---|
[백준/1475번/C++] 방 번호 (0) | 2024.10.28 |
[백준/2576번/C++] 홀수 (0) | 2024.10.27 |
[백준/2490번/C++] 윷놀이 (0) | 2024.10.27 |
[백준/2752번/C++] 세수정렬 (0) | 2024.10.25 |