[백준] Baekjoon Online Judge
문제
상근이는 모니터를 여러개 붙여서 대형 모니터를 만드는 일을 하고 있다.
고객은 대형 모니터의 가로, 세로 해상도(픽셀)과 가로 세로 크기(밀리미터)를 상근이에게 주문한다. 상근이는 고객의 주문 값보다 크거나 같은 해상도, 크거나 같은 크기의 대형 모니터를 만들어야 한다. 이때, 제조비가 최소가 되어야 한다.
대형 모니터는 항상 같은 종류의 모니터로 만들어야 한다. 대형 모니터의 해상도, 크기는 모니터를 붙인 형태로 각각을 더하면 되고, 가격은 사용한 모니터의 가격의 합이다.
상근이의 창고에는 모니터가 여러 종류가 있고, 각각의 해상도와 크기, 가격은 모두 알고 있다. 모니터를 회전 시켜서 대형 모니터를 만들 수 있다. 하지만, 대형 모니터에 포함된 모니터는 모두 같은 방향이어야 한다. 상근이는 모니터를 매우 많이 가지고 있어, 필요한 만큼 사용할 수 있다.

입력
첫째 줄에 대형 모니터의 가로 세로 해상도, 가로 세로 크기 rh, rv, sh, sv가 주어진다. 각 값은 100보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
다음 줄에는 상근이가 가지고 있는 모니터 종류의 개수 n이 주어진다. (1 ≤ n ≤ 100)
다음 n개 줄에는 각 모니터의 가로 세로 해상도, 가로 세로 크기, 가격 rh,i, rv,i, sh,i, sv,i, pi 가 주어진다. 이 값도 모두 100보다 크거나 같고, 10,000보다 작거나 같다.
출력
첫째 줄에 대형 모니터를 만드는 가격 중 가장 저렴한 가격을 출력한다.
풀이
#include <iostream>
#include <cmath>
using namespace std;
int rh, rv, sh, sv, n;
int price(int a, int b, int x, int y, int price);
// 모니터 만드는 비용 계산
int price(int a, int b, int x, int y, int price) {
int h = max(ceil((double)rh / a), ceil((double)sh / x)); // 가로에 필요한 모니터 수
int v = max(ceil((double)rv / b), ceil((double)sv / y)); // 세로에 필요한 모니터 수
return h * v * price;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> rh >> rv >> sh >> sv >> n;
int result = 100000000001;
while (n--) {
int a, b, x, y, p;
cin >> a >> b >> x >> y >> p;
// 모니터를 회전시킬 수 있기에
result = min(result, min(price(a, b, x, y, p), price(b, a, y, x, p)));
}
cout << result << '\n';
return 0;
}
// 모니터 만드는 비용 계산
int price(int a, int b, int x, int y, int price) {
int h = max(ceil((double)rh / a), ceil((double)sh / x)); // 가로에 필요한 모니터 수
int v = max(ceil((double)rv / b), ceil((double)sv / y)); // 세로에 필요한 모니터 수
return h * v * price;
}
모니터 제작에 드는 비용을 구하는 함수이다. 주문 받은 길이와 해상도를 모두 만족해야 하기에 max()로 둘 중 모니터가 더 많이 드는 것을 구하게끔 했다. 또한 나머지가 있는 경우, 예를 들어 1.1개의 모니터가 필요하다면 모니터를 자를 수 없으므로 2개의 모니터를 사용해야 한다. 그렇기에 무조건 올림을 해야 하므로 ceil()을 사용하였다.
int result = 100000000001;
while (n--) {
int a, b, x, y, p;
cin >> a >> b >> x >> y >> p;
// 모니터를 회전시킬 수 있기에
result = min(result, min(price(a, b, x, y, p), price(b, a, y, x, p)));
}
모니터 제작에 필요한 최소 금액을 구하는 부분의 코드이다. 모니터를 돌릴 수 있기에 price()연산을 두 번 하였고, 둘 중 더 작은 것을 result와 비교하여 작은 것을 result에 저장하도록 했다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 33575번 - 시간표 (0) | 2025.05.12 |
---|---|
[Baekjoon/C++] 24937번 - SciComLove (2022) (0) | 2025.05.08 |
[Baekjoon/C++] 15667번 - 2018 연세대학교 프로그래밍 경진대회 (0) | 2025.05.07 |
[Baekjoon/C++] 5618번 - 공약수 (0) | 2025.05.06 |
[Baekjoon/C++] 33810번 - SciComLove (2025) (0) | 2025.05.05 |