Study/Algorithm

[BOJ] 백준 1267번: 핸드폰 요금_자바(JAVA)

delay100 2024. 2. 1. 16:39
728x90
반응형

1. 문제

https://www.acmicpc.net/problem/1267

 

1267번: 핸드폰 요금

동호가 저번 달에 이용한 통화의 개수 N이 주어진다. N은 20보다 작거나 같은 자연수이다. 둘째 줄에 통화 시간 N개가 주어진다. 통화 시간은 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net


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
반응형