Stay Hungry Stay Foolish

BOJ 코딩테스트/Bronze

BOJ 5532 : 방학 숙제 (Java/구현/Bronze 4)

dev스카이 2024. 10. 10. 16:05

[문제 링크] 👉 https://www.acmicpc.net/problem/5532


설명

방학은 총 L일이다. 수학은 총 B페이지, 국어는 총 A페이지를 풀어야 한다. 상근이는 하루에 국어를 최대 C페이지, 수학을 최대 D페이지 풀 수 있다. 상근이가 겨울 방학동안 숙제를 하지 않고 놀 수 있는 최대 날의 수를 구하는 프로그램을 작성하시오.

 

풀이

하루에 풀 수 있는 양을 총 페이지 수로 나눠서 최소한 며칠까지 다 풀 수 있는지를 구한다. 

- 국어 총 페이지 수 / 국어 하루 할당량, 수학 총 페이지 수 / 수학 하루 할당량

만약에 계산한 결과가 국어는 몫이 4, 나머지가 1일 때, 1페이지가 남았으므로 4일 + 1일을 해서 총 5일만에 끝낼 수 있고,

수학은 몫이 3, 나머지가 6일 때, 6페이지가 남았으므로 3일 + 1일을 해서 총 4일만에 끝낼 수 있다.

 

국어와 수학 중 더 큰 일수는 5일인 국어이다. 수학을 먼저 끝내도 국어를 아직 안 끝냈으니 5일이 되어야 숙제를 다 할 수 있다. 그래서 Math.max() 를 이용해 둘 중에 최대값을 구한다. 그리고 나머지가 있으면 +1을 해준다. 

 

최종적으로, 방학이 총 20일이라고 했을 때 숙제를 한 5일을 빼면 놀 수 있는 날은 15일이다.

 

  • Math.max(a, b) : java.lang 라이브러리에 속하는 메서드
  • Math.ceil() : 올림하는 메서드, 소수점 뒤에 1 이상의 숫자가 있으면 올린다.

 

 

 

Solution

import java.io.*;

public class Main {
    public static void main(String[]  args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int l = Integer.parseInt(br.readLine());
        int a = Integer.parseInt(br.readLine());
        int b = Integer.parseInt(br.readLine());
        int c = Integer.parseInt(br.readLine());
        int d = Integer.parseInt(br.readLine());

        double max = 0;
        max = Math.max((double)a/(double)c, (double)b / (double)d);
        max = Math.ceil(max); //ceil() 올림 메서드 : 소수점 뒤에 1이상의 숫자가 있으면 올림
        l -= (int)max;
        System.out.print(l);
    }
}

 

 

👩‍💻 회고

실패한 코드이다. 왜 틀린지 모르겠다. 내 예상은 조건이 너무 한정적이라는 것이다. 서로소 일 때? 흠...

        int maxDay = Math.max(a / c, b / d); //큰 일수를 구함
        if (Math.max(a % c, b % d) != 0) { //나머지가 있으면 +1일 추가
            maxDay += 1;
        }
        System.out.println(l - maxDay);

 

나중에 다시 풀어야 할 문제이다.

그리고 이번에 주의해야 할 점을 알았다. Buffered를 사용할 때 항상 String형으로 고정되어 있으니 출력할 때도 정수는 정수형으로 변환해야 한다는 점이다.  

 

📌 주의

bw.write(String.valueOf(l - maxDay));