https://www.acmicpc.net/problem/1094
1094번: 막대기
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대
www.acmicpc.net
풀이 1.
#include <bits/stdc++.h>
// bitmask[i] 2^i 길이의 막대의 갯수를 의미한다.
int bitmask[7];
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
bitmask[6] = 1;
int x;
int sum = 64;
std::cin >> x;
int ans = 0;
while(sum != x){
int i = 0;
// 가장 짧은 막대를 찾는다.
while(bitmask[i] == 0){
++i;
}
if ((sum - (1 << (i - 1))) >= x){
bitmask[i]--;
bitmask[i - 1]++;
sum -= (1 << (i - 1));
}
else {
bitmask[i]--;
bitmask[i - 1] = 2;
}
}
for (int i = 0; i < 7; ++i){
if (bitmask[i]) ++ans;
}
std::cout << ans << "\n";
return 0;
}
풀이2.
#include <bits/stdc++.h>
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int x;
std::cin >> x;
int ans = 0;
// 2의 거듭제곱꼴의 합으로 x를 나타낼 때, 어떤 거듭제곱이 필요한가에 대한 문제로 생각할 수 있다.
// 64 = 2^6
for (int i = 0; i <= 6; ++i){
if (x & (1 << i)) ++ans;
}
std::cout << ans << "\n";
return 0;
}
'백준 문제풀이 > Bitmask' 카테고리의 다른 글
[C++] 백준 문제풀이 (Bitmask) 12833번 XORXORXOR (0) | 2023.07.07 |
---|---|
[C++] 백준 문제풀이 (Bitmask) 25166번 배고픈 아리의 샌드위치 구매하기 (1) | 2023.05.28 |
[C++] 백준 문제풀이 (Bitmask) 2961번 도영이가 만든 맛있는 음식 (0) | 2023.05.28 |
[C++] 백준 문제풀이 (Bitmask) 24389 2의 보수 (1) | 2023.05.28 |
[C++] 백준 문제풀이 (Bitmask) 11723 집합 (0) | 2023.05.28 |