-- 예전 기록/BOJ

[ BOJ ] 1212 : 8진수 2진수 ( BRONZE 2 ) / C, Python

rejo 2023. 11. 21. 10:50

문제

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

입력

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

출력

첫째 줄에 주어진 수를 2진수로 변환하여 출력한다. 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다.

풀이 과정

8진수를 10진수로 변환하고, 10진수를 2진수로 변환하기엔 주어지는 수의 길이가 크기 때문에 8진수를 2진수로 바로 변환해야 한다.

8진수를 2진수로 변환하기 위해, 8진수 한 자리당 2진수 세 자리씩 변환하여 출력한다.

맨 앞자리는 무조건 1로 시작해야 함을 유의한다.

 

C 환경에서는 strlen() 을 너무 자주 호출하면, 수의 길이 압박 때문에 시간 초과가 날 수 있음을 주의한다.

C

#include <stdio.h>
#include <string.h>

char n[340000];

int main(void) {
    scanf("%s", n);
    int n_size = strlen(n);

    if (n_size == 1 && n[0] == '0') printf("0");
    else {
        for (int i = 0; i < n_size; i++) {
            if (i == 0) { // 첫 번째 수는 앞 0이 나오지 않아야 함.
                int done = 0;
                for (int k = 2; k >= 0; k--) {
                    if (((n[i] - '0') & (1 << k)) >> k == 0 && done == 0) continue;
                    else {
                        printf("%d", ((n[i] - '0') & (1 << k)) >> k);
                        done = 1;
                    }
                }
            }
            else {
                for (int k = 2; k >= 0; k--) printf("%d", ((n[i] - '0') & (1 << k)) >> k);
            }
        }
    }
    return 0;
}

Python

import sys
input = sys.stdin.readline

string = input().rstrip()
print(bin(int(string, 8))[2:])