본문 바로가기

백준/C++

[Baekjoon/C++] 1373번 - 2진수 8진수

Baekjoon Online Judge

문제로 이동

 

문제

2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.

 

입력

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

 

출력

첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.

 


예제 입력 예제 출력
11001100 314

풀이

#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std;

int main() {
	string n; // 2진수
	cin >> n;

	string num8 = ""; // 8진수

	// 진수 변환
	for (int i = n.length() - 1; i >= 0; ) {
		int sum = 0;

		// 2진수를 3개씩 쪼개서 진수 변환
		for (int j = 0; j < 3; j++) {
			if (i < 0) break;

			int num2 = n[i] - '0';

			sum += num2 * pow(2, j);
			i--;
		}

		// 변환한 수 합치기
		num8.append(to_string(sum));
	}

	// 문자열 뒤집기
	reverse(num8.begin(), num8.end());

	// 출력
	cout << num8 << endl;

	return 0;
}

int로는 수의 길이가 1,000,000일 수도 있는 2진수를 모두 받지 못하기에 string으로 입력받았다. 그리고 입력한 2진수를 맨 뒤부터 3개씩 잘라서 8진수로 변환했다.

ex)
11001100 > 011 001 100 > 0*2^2 + 1*2^1 + 1*2^0  0*2^2 + 0*2^1 + 1*2^0  1*2^2 + 0*2^1 + 0*2^0 > 3 1 4

수의 맨뒤부터 변환하는 것이기에 8진수로 변환한 결과를 저장하는 변수 num8은 답이 뒤집힌 상태이므로 reverse()로 변수를 한번 뒤집은 다음에 답을 출력했다.