본문 바로가기

알고리즘 공부/백준

1212번 8진수 2진수 with C++

문제

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

 

1212번: 8진수 2진수

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

www.acmicpc.net

 

해결한 방법

나누기

1. 8진수중 가장 큰 자리수는 4보다 작은 수일때 0으로 채울 필요가 없어서 가장 큰 자리수와 나머지 자리수를 따로 출력해주었습니다.

2. 8진수의 각 자리수를 int형으로 바꿔서 2로 나눈 나머지를 앞에 입력하고 2로 나누고 다시 2로 나눈 나머지를 앞에 입력하는 것을 자리수가 0이 될 때까지 반복합니다.

3. 가장 큰 자리수를 제외한 나머지 자리수들에 대해서 출력이 3자리수가 아니라면 앞에 0을 붙여줍니다.
#include <iostream>
#include <string>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	string input;
	cin >> input;

    if(input == "0"){
        cout << 0;
        return 0;
    }
    
	char temp;
	string result;

	temp = input[0] - '0';
	result = "";
	char ch;
	while (temp) {
		ch = temp % 2 + '0';
		result = ch + result;
		temp /= 2;
	}
	cout << result;

	for (int i = 1; i < input.size(); i++) {
		temp = input[i] - '0';
		result = "";
		char ch;
		while (temp) {
			ch = temp % 2 + '0';
			result = ch + result;
			temp /= 2;
		}

		while (result.size() < 3)
			result = '0' + result;
		cout << result;
	}

	return 0;
}

 

비트 연산

1. 8진수중 가장 큰 자리수는 4보다 작은 수일때 0으로 채울 필요가 없어서 가장 큰 자리수와 나머지 자리수를 따로 출력해주었습니다.

2. 4와 and 연산을하고 오른쪽 쉬프트연산(>>)을 두번 해주면 2진수에서 4에 해당하는 자리수만 가져올수 있습니다. 이와 같은 방법으로 2와 and, 1과 and 연산을 해서 각 자리수를 찾아내어 출력해줍니다.

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

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	string input;
	cin >> input;

	if (input[0] >= '4') {
		cout << ((input[0] & 4) >> 2);
		cout << ((input[0] & 2) >> 1);
		cout << (input[0] & 1);
	}
	else if (input[0] >= '2') {
		cout << ((input[0] & 2) >> 1);
		cout << (input[0] & 1);
	}
	else {
		cout << (input[0] & 1);
	}

	int len = input.size();
	for (int i = 1; i < len; i++) {
		cout << ((input[i] & 4) >> 2);
		cout << ((input[i] & 2) >> 1);
		cout << (input[i] & 1);
	}

	return 0;
}

 

원래 두번째 방법은 개선한 방법으로 올리려고 했는데 시간이 더 걸려서 개선했다고 하기 힘들어서 두번째 방법으로 올립니다. 

 

두번째 방법은 https://www.acmicpc.net/source/31302412 에서 참고한 코드입니다.

'알고리즘 공부 > 백준' 카테고리의 다른 글

17103번 골드바흐 파티션 with C++  (0) 2022.07.19
2089번 -2진수 with C++  (0) 2022.07.18
1373번 2진수 8진수 with C++  (0) 2022.07.12
17087번 숨바꼭질 6 with C++  (0) 2022.07.12
9613번 GCD 합 with C++  (0) 2022.07.12