숫자 x가 주어졌다고 가정해 봅시다. 우리에게는 면에 2부터 7까지의 숫자가 적혀 있는 육면체 주사위가 하나 있습니다. 목표는 주사위를 굴려 나온 눈금을 모두 더했을 때 정확히 x점을 만드는 것입니다.
여기서 중요한 점은 굴리는 횟수 자체에는 제약이 없다는 것입니다. 즉, 합계가 정확히 x점이 되기만 한다면 몇 번을 굴리든 상관없으며, 가능한 굴림 횟수 중 아무거나 하나만 구하면 됩니다. 운이 아주 좋아서 선택한 횟수로 x점을 만들 확률이 0이 아니라면 반드시 그렇게 굴릴 수 있다고 가정하므로, 우리는 그 횟수를 찾아 출력하기만 하면 됩니다.
예시
입력이 x = 100이라면 출력은 50입니다. 주사위의 최소 눈금이 2이므로, 2가 50번 나오면 정확히 100점을 만들 수 있기 때문입니다. 물론 다른 조합도 가능합니다. 예를 들어 2를 11번, 3을 6번, 6을 10번 굴려 총 27번으로 100점을 달성할 수도 있습니다.
접근 방법
이 문제의 핵심 아이디어는 다음과 같습니다.
- 주사위의 모든 면은 최소 2 이상이므로, 한 번 굴릴 때마다 최소 2점씩 얻습니다.
- n번 굴렸을 때 얻을 수 있는 최소 점수는 2n이므로, 정확히 x점을 만들려면 n ≤ x/2를 만족해야 합니다.
- 반대로 n = ⌊x/2⌋일 때는 항상 x점을 만들 수 있습니다. x가 짝수면 모두 2만 나오면 되고, x가 홀수면 2를 ⌊x/2⌋ − 1번, 3을 한 번 나오게 하면 됩니다.
결론적으로 답은 x를 2로 나눈 값의 내림(floor)입니다.
return floor of (x / 2)
구현 예제
더 잘 이해하기 위해 다음 구현을 살펴보겠습니다.
#include<bits/stdc++.h>
using namespace std;
int solve(int x){
return x/2;
}
int main(){
int x = 100;
cout << solve(x) << endl;
}
입력
100
출력
50