2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
이 문제를 풀기 위해서는 2진수와 8진수의 관계를 알아야 한다. 2진수에서 8진수로 갈려면 첫번째 자리수부터 세번째 자리수까지 $2^0,\space 2^1,\space 2^2$순으로 각각 자릿수의 값을 순서대로 곱해준 뒤 합해주면 된다. 그렇게 처음 3개의 값을 더한 뒤 나온 값이 8진수의 첫번째 자리수이다. 이 방식을 반복해서 두번째 자리수 3번째 자리수까지 만들어주면 되는 것이다. 이해가 잘 안된다면 그림과 함께 설명한 이 링크를 확인해보길 바란다.
우선 자리수마다 접근을 해야 되기 때문에 문자열로 입력을 받은 뒤 제일 첫번째 자리수부터 시작하여 하나씩 접근한다. 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();
}
}