IT 프로그래밍/백준

[C++] 백준 1094번 : 막대기

기술1 2024. 5. 19. 16:21
반응형

#include <iostream>
#include <string>
#include <bitset>
#define N 8
using namespace std;


int main()
{
	int x = 0;
	cin >> x;

	string binary = bitset<N>(x).to_string();

	int count = 0;
	for (int i = 0; i < N; i++)
	{
		if (binary[i] == '1')
		{
			count++;
		}
	}
	cout << count << endl;

	return 0;
}

문제

 

문제코드

#include <iostream>
#include <string>
#include <bitset>
#define N 8
using namespace std;


int main()
{
	int x = 0;
	cin >> x;

	string binary = bitset<N>(x).to_string();

	int count = 0;
	for (int i = 0; i < N; i++)
	{
		if (binary[i] == '1')
		{
			count++;
		}
	}
	cout << count << endl;

	return 0;
}

 

문제풀이

해당 문제는 Bitset을 알아야 풀 수 있는 문제입니다. 

먼저 처음에 64cm를 가지고 있고 이후 계속 절반으로 나눕니다. 절반만 사용하므로 사용할 수 있는 막대기의 길이는 

- 1, 2, 4, 8, 16, 32, 64에 해당합니다.

 

그렇다면 이는 2진수로 생각을 할 수 있습니다. 내가 만들 수 X에 대해 이진수로 변환한 후에 1의 개수를 구하면 그 값이 X의 막대기의 개수가 되는 것입니다.

 

ex)  64 : 0100 0000 이므로 1개
       15 : 0000 1111 이므로 4개

따라서 해당 문제는 x를 이진수로 변환해 1의 개수를 출력하면 되는 간단한 문제입니다. 하지만 bitset을 모른다면 2진수를 출력할 수 없기 때문에 해당 문제에서 박힌 분들은 bitset에 대한 개념이 부족해서 그런 것입니다.

 

물론 해당 문제 풀이로 말고 vector로 따라가면서 풀어도 풀 수 있습니다.

 

bitset 란?

 

bitset는 c++ 표준 라이브러리에서 제공하는 템플릿 클래스로 고정 크기의 비트를 관리하고 각 비트에 대해서 개별적인 조작을 할 수 있는 것입니다. 

 

bitset<8>은 8개의 비트를 가지는 bitset의 객체를 의미합니다. 

	string binary = bitset<N>(x).to_string();​

여기서 N은 #define 8로 되어 있기 때문에 8에 해당합니다. 즉 8비트의 비트셋을 생성하는 것입니다. bitest<8>(x) 는 정수 x를 8비트의 이진수로 변환합니다. 예를들면 x가 5이면 이진수로 '0000 0101' 이 생성되는 것입니다. 

 

이 생성된 객체을 판별하려면 문자열로 받아들여서 하나하나씩 분석해서 찾아줘야 하는데요. 따라서 to_string을 통해 비트셋을 문자열로 변환합니다. 

 

다른 풀이

#include <iostream>
#include <string>
#include <vector>
using namespace std;


int main()
{
	int x, i, total;
	vector<int> v;

	v.push_back(64);
	total = v[0];

	cin >> x;
	i = 0;

	while (1)
	{
		if (total == x)
		{
			break;
		}

		v[i] /= 2;

		if (total - v[i] >= x)
		{
			total -= v[i];
		}
		else
		{
			v.push_back(v[i]);
			i++;
		}
	}

	cout << v.size() << endl;

	
	return 0;
}

bitset을 사용하지 않고 푼 것입니다. vector의 길이를 추가하면서 vector가 count의 역할을 해주는 것입니다. 그리고 v[i]는 각각의 막대기의 길이에 해당하며 total은 막대기의 버리는 수에 해당합니다.

 

문제를 계속해서 따라서 코딩을 하면 이런 식으로 할 수 있습니다.

 

원래의 의도에 맞춰 본다면 첫 번째 풀이가 정석이라고 볼 수 있습니다. 

반응형

'IT 프로그래밍 > 백준' 카테고리의 다른 글

[C++] 25206번 너의 평점은  (0) 2024.05.21
[c++]백준 1076번 저항  (0) 2024.05.19
C++ 백준 1075 나누기  (0) 2024.05.14
[C++] 백준 1316번 그룹 단어 체커  (0) 2024.04.07
[C++] 백준 2941번 크로아티아 알파벳  (0) 2024.03.31