반응형
문제
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.
막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.
- 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
- 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
- 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
- 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.
X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.
출력
문제의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력한다.
예제 입력 123 |
예제 출력 14 |
예제 입력 232 |
예제 출력 21 |
예제 입력 364 |
예제 출력 31 |
예제 입력 448 |
예제 출력 42 |
풀이
문제 해석이 굉장히 난해한 문제이다.
쉽게 설명하자면 64, 32, 16, 8, 4, 2, 1 중 적절한 것을 하나씩 골라 숫자 X를 만드는 문제이다.
숫자 X를 완성했을 때, 몇 개의 막대를 사용했는지 출력하면 된다.
위에서 알 수 있듯 막대의 길이가 전부 2^n 으로 표현할 수 있다.
즉, 숫자 X를 이진수로 바꾼 뒤 1의 개수를 셌을 때와 정답이 같다는 말이다.
입력받은 정수를 이진수로 변환하고, 1이 몇 개 있는지 세어주도록 하자.
print(bin(int(input())).count("1"))
반응형
'알고리즘 연습 > 구현, 문자열' 카테고리의 다른 글
[🥈4 / 백준 1026 / 파이썬] 보물 (0) | 2021.08.13 |
---|---|
[🥈5 / 백준 4796 / 파이썬] 캠핑 (0) | 2021.08.12 |
[🥈4 / 백준 13268 / 파이썬] 셔틀런 (0) | 2021.08.03 |
[🥈5 / 백준 18311 / 파이썬] 왕복 (0) | 2021.08.02 |
[🥈5 / 백준 1476 / 파이썬] 날짜 계산 (0) | 2021.07.30 |