Study/Algorithm
[BOJ] 백준 1267번: 핸드폰 요금_자바(JAVA)
delay100
2024. 2. 1. 16:39
728x90
반응형
1. 문제
https://www.acmicpc.net/problem/1267
2. 접근 및 해결
2-1) 접근
문제에서 주의할 점은 아래의 단락입니다.
영식 요금제는 30초마다 10원씩 청구된다.
이 말은 만약 29초 또는 그 보다 적은 시간 통화를 했으면 10원이 청구된다.
만약 30초부터 59초 사이로 통화를 했으면 20원이 청구된다.
민식 요금제는 60초마다 15원씩 청구된다.
이 말은 만약 59초 또는 그 보다 적은 시간 통화를 했으면 15원이 청구된다.
만약 60초부터 119초 사이로 통화를 했으면 30원이 청구된다.
문제를 보고 29초에 10원씩 청구를 해서 계산하면 되겠구나 생각을 할 수 있는데,
왜냐하면 0~29초(총 29초), 30~59초(총 29초)에 10원이기 때문입니다.
그러나 잘 생각해보면 29*2=58이므로 29초가 몇 번 나왔는지로 계산하면 안된다고 파악을 할 수 있습니다.
따라서 30초 기준으로 몇 번 나왔는지, 30초마다 부과하는 금액을 계산하면 됩니다.
2-2) 해결
문제 자체는 어렵지 않으므로 헷갈리기 좋은 (내가 헷갈렸던) 부분에 대해 반례를 적어보자면..
ySum += 10*(a%29 == 0 ? (a/29) : (a/29+1));
예를들어 a가 88(29*3+1)인경우에는 위의 실패코드에서는 40(10*(3+1))가 출력되고
ySum += 10*(a/30+1);
아래의 성공코드에서는 30(30*2+1)이 출력됩니다.
따라서 29초가 아닌 30초에 부과를 계산하고, 30초 아래의 시간이 있는 경우에는 +1로 계산하게 끔 해주면 됩니다.
+1을 해주는 이유는 통화시간은 무조건 1초이상이기때문에(0초도 통화라고 치면 +1을 if문을 이용해 써줘야 했을 것) +1을 무조건 해주면 됩니다.
예를들어,
통화시간이 29초인 경우 30으로 나누면 몫이 0인데 무조건 +1(통화시간 29초)을 하기때문에 a/60+1은 1
통화시간이 30초인 경우 30으로 나누면 몫이 1이고 무조건 +1(30초가 됐으므로 10원더 부과)을 하기때문에 a/60+1은 2
통화시간이 87초인 경우 30으로 나누면 몫이 2이고 무조건 +1(잔여시간 27초)을 하기때문에 a/60+1은 3통화시간이 90초인 경우 30으로 나누면 몫이 3이고 무조건 +1(30초가 됐으므로 10원 더 부과)를 하기 때문에 a/60+1은 4가 됩니다.
3. 코드(JAVA)
import java.io.*;
import java.util.*;
public class p1267 {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int ySum = 0;
int mSum = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i=0; i<N; i++) {
int a = Integer.parseInt(st.nextToken());
ySum += 10*(a/30+1);
mSum += 15*(a/60+1);
}
if(ySum < mSum)
bw.write("Y "+Integer.toString(ySum));
else if(ySum > mSum)
bw.write("M "+Integer.toString(mSum));
else
bw.write("Y M "+Integer.toString(ySum));
br.close();
bw.close();
}
}
728x90
반응형