막대기
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.
막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.
- 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
- 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
- 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
- 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.
X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // // Created by az91t on 2019-05-20. // #include <iostream> using namespace std; int main() { int X; cin>>X; int count=1, min=64, sum=64; while(sum>X) { min=min/2; if(sum-min>=X) { sum-=min; } else { count++; } } cout<<count; return 0; } | cs |
왜 이런 쉬운 문제를?
링크를 보면 알겠지만 이 문제는 정답률 73퍼센트의 굉장히 쉬운 문제이다.
슬프게도 나는 이 문제를 이해하지 못해서 한참을 들여다봤다.
- 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
이 부분이다.
버렸는데 또 버리면 0이 되잖아! 하고 생각하면서 한참을 메모장에 썼다 지웠다 한 결과 이해했다.
앞으로가 심히 걱정되는 부분이다.
'하나를 버리고'가 아니라 '하나를 제외한' 막대의 길이의 합이라고 하는 게 훨씬 알아먹기 쉬울 듯하다.
개떡 같이 알아먹은 내 잘못이지만...
'PS' 카테고리의 다른 글
백준 1699번 C++ 제곱수의 합 (0) | 2019.05.28 |
---|---|
백준 2439번 C++ 어이없는 실수 (0) | 2019.05.23 |
백준 10253번 C++ 헨리 (0) | 2019.05.20 |
백준 1107번 C++ 리모컨 문제 (추가) (0) | 2019.05.18 |
백준 1157번 C++ 단어 공부 (2) | 2019.05.13 |
댓글