백준 c++/(1-1)백준 c++ 알고리즘 기초

백준 1373 c++ 2진수 8진수

현구구 2022. 7. 11. 15:59

https://www.acmicpc.net/problem/1373

 

1373번: 2진수 8진수

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

www.acmicpc.net


오답코드

 

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


int main()
{
	string two;
	cin >> two;
	unsigned long long TwoToTen = 1;
	unsigned long long ten=0;
	for (long long i = two.size() - 1; i >= 0; i--)
	{
		ten = ten + (int(two[i] - '0') * TwoToTen);
		TwoToTen = TwoToTen * 2;
	}
	stack<unsigned long long> eight;
	while (1)
	{
		if (ten / 8 == 0)
		{
			eight.push(ten);
			break;
		}
		else
		{
			eight.push(ten % 8);
			ten = ten / 8;
		}
	}
	while(!eight.empty())
	{
		cout << eight.top();
		eight.pop();
	}
}

처음에는 2진수->10진수->8진수로 하자는 생각을 했고 그 과정에서 stack을 사용하였다.

그러나 문제가 수의 크기 제한이 1,000,000이 아니라 길이 제한이 1,000,000이기 때문에 메모리 문제가 발생한다.


맞은코드

 

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

int main()
{
	string two;
	cin >> two;//2진수 입력
	if (two.size() % 3 == 1)//size가 3으로 안나누어 떨어지면 3으로 나누어떨어지도록 앞에 계산에 영향없는 '0'추가
	{
		two = "00" + two;
	}
	else if (two.size() % 3 == 2)
	{
		two = '0' + two;
	}
	for (int i = 0; i < two.size(); i = i + 3)//2진수를 3칸으로 앞에서부터 4,2,1을 곱하고 더해서 출력
	{
		cout << int(two[i]-'0') * 4 + int(two[i + 1]-'0') * 2 + int(two[i + 2]-'0') * 1;
	}
}

3칸씩 나누어서 계산한다 3으로 안나누어 떨어질 경우 앞에 값에 영향을 안주는 0을 추가하고 계산을 시작한다

'백준 c++ > (1-1)백준 c++ 알고리즘 기초' 카테고리의 다른 글

백준 2089 c++ -2진수  (0) 2022.07.12
백준 1212 c++ 8진수 2진수  (0) 2022.07.12
백준 17087 c++ 숨바꼭질 6  (0) 2022.07.07
백준 9613 c++ GCD합  (0) 2022.07.07
백준 2004 c++ 조합 0의 개수  (0) 2022.07.07