[문제 링크] 👉 https://www.acmicpc.net/problem/1267
설명
영식 요금제는 30초마다 10원씩 청구된다. 이 말은 만약 29초 또는 그 보다 적은 시간 통화를 했으면 10원이 청구된다. 만약 30초부터 59초 사이로 통화를 했으면 20원이 청구된다.
민식 요금제는 60초마다 15원씩 청구된다. 이 말은 만약 59초 또는 그 보다 적은 시간 통화를 했으면 15원이 청구된다. 만약 60초부터 119초 사이로 통화를 했으면 30원이 청구된다.
통화 시간 목록이 주어지면 어느 요금제를 사용 하는 것이 저렴한지 출력하는 프로그램을 작성하시오.
풀이
각 시간마다 30과 60으로 나누고, 그 몫에 + 1을 해준다.
- ( 각 시간 / 30 ) + 1
- ( 각 시간 / 60 ) + 1
+ 1을 해주는 이유는 통화한 시간이 30초, 60초 이하인 경우도 요금을 부과해야 하는데, 몫이 0이면 요금 부과를 못하기 때문이다. 또한 나머지가 생겼을 때도 그 나머지가 요금을 부과해야 하는 범위에 속하기 때문에 + 1을 해야 한다.
위에서 계산한 값에 각자 10과 15을 곱한다.
- ( ( 각 시간 / 30 ) + 1 ) * 10
- ( ( 각 시간 / 60 ) + 1 ) * 15
Solution
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int time, y = 0, m = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
time = Integer.parseInt(st.nextToken());
y += ((time / 30) + 1) * 10;
m += ((time / 60) + 1) * 15;
}
if (y > m) { //영식 요금제가 더 비싸면
System.out.println("M " + m);
} else if (y < m) { //만식 요금제가 더 비싸면
System.out.println("Y " + y);
} else {
System.out.println("Y M " + y);
}
}
}
👩💻 회고
망한 풀이
for (int i : time) {
//영식 요금제
if (i >= 30) { //통화한 시간이 30초 이상이면
y += (i / 30) * 10; //요금에 더하기
if (i % 30 != 0) { //나머지가 있으면
y += 10; //요금에 10원 추가
}
} else {
y += 10; //30초 이하이면 10원만 더함
}
//만식 요금제
if (i >= 60) { //통화한 시간이 60초 이상이면
m += (i / 60) * 15; //요금에 더하기
if (i % 60 != 0) { //나머지가 있으면
m += 15; //요금에 15원 추가
}
} else {
m += 15; //60초 이하이면 15원만 더함
}
}
반례
2
60 65
다른 예제는 다 맞혔지만 반례가 있었다... 조건을 더 추가했어야 했다. 그렇게 되면 내 코드는 더러워지겠지... 그래서 다른 풀이 봤다. 조금 더 분발하자.
'BOJ 코딩테스트 > Bronze' 카테고리의 다른 글
BOJ 1598 : 꼬리를 무는 숫자 나열 (Java/수학/Bronze 3) (0) | 2024.10.12 |
---|---|
BOJ 1284 : 집 주소 (Java/구현/Bronze 3) (0) | 2024.10.12 |
BOJ 9295 : 주사위 (Java/구현/Bronze 4) (0) | 2024.10.10 |
BOJ 5596 : 시험문제 (Java/구현/Bronze 4) (0) | 2024.10.10 |
BOJ 5532 : 방학 숙제 (Java/구현/Bronze 4) (0) | 2024.10.10 |