[문제 링크] 👉 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));
'BOJ 코딩테스트 > Bronze' 카테고리의 다른 글
BOJ 9295 : 주사위 (Java/구현/Bronze 4) (0) | 2024.10.10 |
---|---|
BOJ 5596 : 시험문제 (Java/구현/Bronze 4) (0) | 2024.10.10 |
BOJ 5554 : 심부름 가는 길 (Java/구현/Bronze 4) (1) | 2024.10.09 |
BOJ 5524 : 입실 관리 (Java/구현/Bronze 4) (1) | 2024.10.09 |
BOJ 4470 : 줄번호 (Java/구현/Bronze 4) (1) | 2024.10.09 |