백준 - 1373

아따맘마·2020년 11월 22일
0

알고리즘 - 백준

목록 보기
3/53

문제

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

입력

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

출력

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

예제

  • 입력 : 11001100
  • 출력 : 314

풀이

  • 벡터 변수 사용
  • 2진법 수를 뒤에서부터 세개씩 묶어 각 자릿수의 합을 더해주면 8진수가 나온다.

reverse_iterator

vector <int> ::reverse_iterator riter, res_iter;
for (riter = v.rbegin(); riter != v.rend(); riter++)
{
	...
}

벡터 변수를 순방향이 아닌 역방향으로 이용.

코드

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

int main()
{
	string			str;
	vector <int>	v;
	vector <int>	res;
	int				tmp = 0;
	int				count = 0;

	cin >> str;
	v.push_back(0);
	v.push_back(0);
	for (int i = 0; i < str.length(); i++)
		v.push_back(str[i] - '0');
	vector <int> ::reverse_iterator riter, res_iter;
	for (riter = v.rbegin(); riter != v.rend(); riter++)
	{
		for (int j = 0; j < count; j++)
			*riter *= 2;
		tmp += *riter;
		count++;
		if (count % 3 == 0 )
		{
			res.push_back(tmp);
			count = 0;
			tmp = 0;
		}
	}
	for (res_iter = res.rbegin(); res_iter != res.rend(); res_iter++)
		cout << *res_iter;
	return (0);
}

주의할 점

	v.push_back(0);
	v.push_back(0);

psuh_back(0)을 두번 실행한 이유는
1101와 같이 세개씩 나눌 때 딱 나누어 떨어지지 않은 경우를 위해서이다.
count % 3 == 0 일때 결과물에 push_back을 해주는데, 만약 위 경우처럼 나누어 떨어지지 않는다면 첫번째 자리수가 빠지게 된다.

profile
늦게 출발했지만 꾸준히 달려서 도착지점에 무사히 도달하자

0개의 댓글