www.acmicpc.net/problem/1373

 

1373번: 2진수 8진수

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

www.acmicpc.net

 

처음 생각했을 땐, 오 쉬운데 했다.

 

근데 2진수에서 8진수로 바꿔야 하니깐. 

지금 연습하고 있는 c++언어로 하기로 했다. 

 

먼저 내 생각은 문자열로 받아서

10개의 길이를 받는다면, 

만약 

1 0 1 1 0 1 1 0 1 0

을 받는다면 

 

 1   0   1   1   0   1   1   0   1   0 
 1   3   3   2 


이렇게 바꿔야 한다. 

그래서 나는 계산을 해보았다, 

사이즈를 가지고 처음부터 계산을 해보자 해서

 

일단 그럼 1 2 4를 가지는 배열(eight)을 정해놓고 이용하자라는 생각이 들었다.

 

(size - i) % 3을 하면 1이 남으니깐,

계산하기 위해 정해놓은 배열(eight)의 eight [0] == (1)이 된다. 

 

그런데 eight의 방은 0번방인데, (size - i) % 3 은 1이 나오니깐 단순히 -1을 하기에는

size가 10일때 i가 4이면,

(size - i) % 3 => 0이 나오는데 나의 의도로는 2가 나와야 한다. 

 

그래서 (((size - i) % 3 ) +2 )%3 을 해줬다. 

2를 넘으면 안 돼서 ,,,

 

그렇게 3자리를 더하고 

만약 (size - i) % 3 이 1이 나오면 == {1, 2, 4}에서 1까지 다 더한 후라면

다 더한 값을 vector를 통해 뒷부분에 넣었다. 

 

그랬더니 한번에 통과!

 

소스 코드

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

int main() {
	string input;
	vector<int> answer;
	int eight[4] = { 1,2,4};
	int size;
	int sum = 0; 
	
	//문자 받기
	cin >> input;

	size = input.length();
	for (int i =0; i <size; i++) {
		if (input[i] == '1') {
			sum += ((input[i]-'0') * eight[(((size - i) % 3) + 2) % 3]);
		}
		if ((size - i) % 3 == 1) {
			answer.push_back(sum);
			sum = 0;
		}
	}
	for (int i = 0; i < answer.size(); i++) {
		cout << answer[i];
	}
	return 0;
}

 

 

c++을 잘 안써봐서

많이 필요 없는 부분이 있을 수 있는데, 

그래도 쓰고 통과해서 좋았다. 

'Coding Test > Problem_solving' 카테고리의 다른 글

[백준] 9237_이장님 초대 (c++)  (0) 2021.06.16
[백준] 2304 창고 다각형 c++  (0) 2021.04.08
[백준] 10808 알파벳 개수  (0) 2021.03.09
[백준] 1874_스택 수열  (0) 2021.02.18
[백준] 9012_괄호  (0) 2021.02.18

+ Recent posts