1 minute read

백준 1373번: 2진수 8진수

문제:

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

입력:

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

풀이:

  • 이 문제를 풀기 위해서는 2진수와 8진수의 관계를 알아야 한다. 2진수에서 8진수로 갈려면 첫번째 자리수부터 세번째 자리수까지 2^0, 2^1, 2^2순으로 각각 자릿수의 값을 순서대로 곱해준 뒤 합해주면 된다. 그렇게 처음 3개의 값을 더한 뒤 나온 값이 8진수의 첫번째 자리수이다. 이 방식을 반복해서 두번째 자리수 3번째 자리수까지 만들어주면 되는 것이다. 이해가 잘 안된다면 그림과 함께 설명한 이 링크를 확인해보길 바란다.
    • 매 세번째 자리수까지 가는 이유는 2^0+2^1+2^2=7이기 때문에 8진수 한자리의 최대값인 7을 넘길 일이 없기 때문이다.
  • 우선 자리수마다 접근을 해야 되기 때문에 문자열로 입력을 받은 뒤 제일 첫번째 자리수부터 시작하여 하나씩 접근한다. 3번째 자리수가 될 때마다 정답 스택에 합한 값을 넣어줘야 되기 때문에 cnt 값을 이용하여 3번째 자리가 될 때마다 정답 스택에 push 해주며 승수 값과 합하는 값을 초기화 해준다.

    ⚠️ 주의해야 될 점은 제일 첫번째 값도 cnt 값이 0으로 설정되어 있기 때문에 정답 스택에 push하는 것을 방지해주는 조건문을 추가 해줘야 된다.

  • 3번째 값이 아닌 경우에는 제일 처음에 말한 연산을 그대로 실현 해준다. char값인 s[i]를 int 값으로 바꿔주면서 승수에 맞게 곱해주면서 2를 곱해주면서 승수를 한개 올린 뒤 cnt를 1 더해준다.
  • 모든 연산이 끝난 뒤 마지막에 cnt가 3이 아니여서 스택에 push 못한 값을 해준 뒤 정답을 출력해준다.

코드:

#include <iostream>
#include <stack>

using namespace std;

int main(){
	int cnt = 0, temp = 0, multiple = 1;
	stack<int> answer;
	string s;
	//입력
	getline(cin, s);
	//첫번째 자리수부터 시작해야 되므로 s의 최대 크기부터 시작
	for(int i = s.size()-1; i >= 0; i--){
		//첫번째 경우를 제외한 매 3번째 연산마다 스택에 넣고 변수 초기화 
		if(cnt%3 == 0 && i != s.size()-1){
			answer.push(temp);
			temp = 0; 
			multiple = 1;
		} 
		//s[i]를 int값으로 바꿔 2의 n승 연산하여 temp에 더 함 
		temp += (s[i]-'0')*multiple;
		//2의 1승 추가
		multiple *= 2;
		cnt++;
	}
	//연산 끝나고 남은 값 추가 
	answer.push(temp);
	//출력 
	while(!answer.empty()){
		cout<<answer.top();
		answer.pop();
	}
	
}

Leave a comment