The Way
백준 1094번: 막대기 본문
백준 온라인 저지(BOJ) 1094번 문제
https://www.acmicpc.net/problem/1094
1. 문제 요약
64cm의 막대기를 가지고 Xcm의 막대기를 만들기.
이 때 다음의 방법을 이용한다.
1. 가지고 있는 막대의 길이를 모두 더해서 X보다 크면, 그 중 가장 작은 길이의 막대기를 절반으로 자른다.
2. 자르고 그 중 하나를 버렸을 때 그 합이 X보다 크거나 같으면 하나를 버린다.
위 과정을 반복해, 남아있는 막대의 합이 X가 되도록 만든다.
이 때 위 과정을 거친다면 몇 개의 막대를 풀로 붙여야 Xcm를 만들 수 있을까?
2. 알고리즘
뭔가 표현은 복잡하지만, 분석해보면 간단함을 깨달을 수 있을 것이다.
64cm부터 시작해서, 가장 짧은 막대의 길이는 점차 반으로 줄어들어 32, 16, 8, 4, ...cm가 될 것이고
이 때 이들의 합으로 목표로 한 막대의 길이를 만들어야 한다.
즉, 이 문제는 주어진 숫자 X를 이진법으로 나타냈을 때 각 자리수 중 1이 몇 개 있는지 묻는 문제와 동치인 것이다.
3. 코드
#include <iostream> using namespace std; int main() { int X; cin >> X; int r = 0; while (X != 0) { if (X % 2 == 1) r++; X /= 2; } cout << r << '\n'; }
190720 내용추가) __builtin_popcount()를 이용하면 편하다
'PS > 백준 온라인 저지' 카테고리의 다른 글
백준 1076번: 저항 (0) | 2017.08.26 |
---|---|
백준 1075번: 나누기 (0) | 2017.08.26 |
백준 2839번: 설탕 배달 (0) | 2017.08.22 |
백준 11719번: 그대로 출력하기 2 (0) | 2017.08.22 |
백준 11718번: 그대로 출력하기 (0) | 2017.08.22 |
Comments