문제
눈사람의 머리 크기 x와 눈덩이 k개가 주어진다. 눈덩이들로 몸통을 만들 수 있는 방법은 세 가지이다.
- 방법 1: 몸통 크기 = 7 * k (머리의 7배)
- 방법 2: 몸통 크기 = 3.5 * k (머리의 3.5배)
- 방법 3: 몸통 크기 = 1.75 * k (머리의 1.75배)
단, 몸통은 머리(x)보다 크지 않아야 한다. 조건을 만족하는 방법 중 가장 큰 몸통 크기를 출력한다. 소수점 문제를 피하기 위해 1000을 곱한 정수 비교를 사용한다.
입력
한 줄에 정수 x와 k가 주어진다.
출력
조건을 만족하는 가장 큰 몸통 크기를 출력한다.
예제
| 입력 | 출력 |
|---|---|
10 1 | 7000 |
5 1 | 3500 |
풀이
1000배 스케일로 정수 산술만 사용하여 실수 비교를 회피한다.
- 세 후보 몸통 크기를 1000배로 스케일하여 계산한다:
a = 7000*k,b = 3500*k,c = 1750*k. - 각 후보가
1000*x이하인 경우에만 해당 변수에 값을 할당한다 (조건 불만족 시 0 유지). max({a, b, c})로 가장 큰 값을 출력한다.
핵심 아이디어: 3.5와 1.75는 실수이므로 직접 비교 시 부동소수점 오류가 발생할 수 있다. 모든 값에 1000을 곱해 정수 범위로 변환하면 ll 타입으로 정확한 비교가 가능하다. 조건 불만족 변수는 0으로 유지되므로 max()에서 자연스럽게 제외된다.
코드
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll x, k, a, b, c;
int main()
{
cin >> x >> k;
if (7000 * k <= 1000 * x)
a = 7000 * k;
if (3500 * k <= 1000 * x)
b = 3500 * k;
if (1750 * k <= 1000 * x)
c = 1750 * k;
cout << max({a, b, c});
}복잡도
- 시간: O(1) — 상수 개수의 조건 검사
- 공간: O(1) — 상수 개수의 변수만 사용