© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 8718 - Bałwanek

2025-12-22
BOJ
브론즈 III
cpp
원본 문제 보기
수학
구현

문제

BOJ 8718 - Bałwanek

눈사람의 머리 크기 x와 눈덩이 k개가 주어진다. 눈덩이들로 몸통을 만들 수 있는 방법은 세 가지이다.

  • 방법 1: 몸통 크기 = 7 * k (머리의 7배)
  • 방법 2: 몸통 크기 = 3.5 * k (머리의 3.5배)
  • 방법 3: 몸통 크기 = 1.75 * k (머리의 1.75배)

단, 몸통은 머리(x)보다 크지 않아야 한다. 조건을 만족하는 방법 중 가장 큰 몸통 크기를 출력한다. 소수점 문제를 피하기 위해 1000을 곱한 정수 비교를 사용한다.

입력

한 줄에 정수 x와 k가 주어진다.

출력

조건을 만족하는 가장 큰 몸통 크기를 출력한다.

예제

입력출력
10 17000
5 13500

풀이

1000배 스케일로 정수 산술만 사용하여 실수 비교를 회피한다.

  1. 세 후보 몸통 크기를 1000배로 스케일하여 계산한다: a = 7000*k, b = 3500*k, c = 1750*k.
  2. 각 후보가 1000*x 이하인 경우에만 해당 변수에 값을 할당한다 (조건 불만족 시 0 유지).
  3. 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) — 상수 개수의 변수만 사용