Stay Hungry Stay Foolish

BOJ 코딩테스트/Bronze

BOJ 1267 : 핸드폰 요금 (Java/구현/Bronze 3)

dev스카이 2024. 10. 12. 00:01

[문제 링크] 👉 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

 

다른 예제는 다 맞혔지만 반례가 있었다... 조건을 더 추가했어야 했다. 그렇게 되면 내 코드는 더러워지겠지... 그래서 다른 풀이 봤다. 조금 더 분발하자.