문제 링크: https://www.acmicpc.net/problem/1373

 

2진수를 8진수로 바꿔서 출력하는 문제입니다. 2진수는 뒤에서부터 3개씩 묶으면 바로 8진수가 됩니다.

예를 들어 \(10010101_{(2)}\)를 8진수로 바꾼다고 생각해 봅시다. 맨 뒤 3자리를 8진수로 바꾸면

\begin{align}
{\color{red}1} {\color{blue}0} {\color{lime}1} _{(2)} &= {\color{red}1} \times 2^2 + {\color{blue}0} \times 2^1 + {\color{lime}1} \times 2^0 \\
&= 5_{(8)}
\end{align}

이렇게 됩니다. 나머지 자릿수도 동일하게 하면 됩니다.

 

구현할 때는 뒤에서부터 변환하면 어딘가에 쌓아두고 나중에 뒤집거나 해야되기 때문에 앞에서부터 변환하는데 2진수의 길이를 재서 길이를 3으로 나눴을 때 나머지가 1이면 앞에 한 칸, 2면 두칸만큼 따로 변환을 했습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

using namespace std;

int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);


	string s;
	cin >> s;

	int sz = s.size();

	if (sz % 3 == 1) {
		cout << s[0];
	}
	else if (sz % 3 == 2) {
		cout << (s[0]-'0')*2 +(s[1]-'0');
	}


	for (int i = sz % 3; i < sz; i += 3) {
		cout << (s[i] - '0') * 4 + (s[i + 1] - '0') * 2 + (s[i+2] - '0');
	}
	cout << '\n';
	

	return 0;
}

소스입니다.

반응형