[백준] 1373번 2진수 8진수

반응형
반응형

문제

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

입력

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

출력

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

 

이 문제는 생각보다 까다뤘다. 신경써야 하는게 한 두개가 아니였다.

보통 이진수에서 8진수로 바꿀 때 3개씩 끝어서 계산한다. 이것도 똫같이 하면 되는데...

문제는 컴퓨터와 사람이 문자열을 읽는 방식에 차이가 있다. 물론 일반 문자열은 크게 틀리지 않는데 문제는 숫자를 읽을때다 01이라는 숫자를 읽을때 컴퓨터는 0부터 인식한다... 그래서 이것을 01이라 읽고 사람은 1부터 읽기 때문에 1이라 읽는다. 뭐 어차피 자세하게 파면 틀린 이야기겠지만... 아무튼 내가 하고 싶은 이야기는 컴퓨터는 왼쪽부터 인식한다는 점이다. 이 점에 유의해서 봐야 한다.

#include <bits/stdc++.h>
using namespace std;
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  string binary;
  cin >> binary;
  
  while (binary.length() % 3 != 0) {
    binary = "0" + binary;
  }
  int count = 2;
  int temp = 0;
  for(int i = 0; i<binary.length();i++) {
    if (count >= 0) {
      temp += (binary[i] - '0') * pow(2,count);
      count--;
    }
    if ((i+1)%3 == 0) { 
      count = 2;
      cout << temp;
      temp = 0;    
    }
  }

}
 

위에서 언급한 부분이 바로 while문 부분이다. 이 부분에서 값을 채워준다. 항상 3 6 9 12 3의 배수로 숫자가 끝나지 않기 때문이다. 이 작업을 해주지 않으면 11001100 은 110 011 00 이렇게 작성될거다. 이를 계산하면 530이 나온다. 답이 이상하게 나온다는 뜻이다. 컴퓨터는 이렇게 계산하는데 사람은 뒤에서 부터 자르기 시작한다. 11 001 100 이런식으로 

답은 314 이렇게 나온다. 이 두개를 일치 시켜주지 않으면 답은 틀리고 만다. 참고로 사람것이 정답이다. 그래서 앞에 0을 붙여줘야 한다. 011 001 100 그럼 사람이 자를때도 컴퓨터가 자를때도 아무런 문제가 없다. 

 

 다른 사람 코드 생략.... 이거라도 작성해야지..ㅎㅎ

반응형

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

[백준] 2089번 -2진수  (0) 2020.04.29
[백준] 1212번 8진수 2진수  (0) 2020.04.25
[백준] 11722번 가장 긴 감소하는 부분 수열  (0) 2020.04.21
[백준]9465번 스티커  (0) 2020.04.20
[백준] 1977번 완전 제곱수  (0) 2020.04.18

댓글

Designed by JB FACTORY