버미

백준 1212번 - 8진수 2진수 본문

코딩 트레이닝

백준 1212번 - 8진수 2진수

Bum_2 2023. 7. 11. 23:02

문제

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

입력

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

출력

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

예제 입력 1

314

예제 출력 1

11001100

시간 초과된 문제 풀이


#include <stdio.h>

int main(void)
{
    long long num, dex_num = 0, binary_num = 0;
    int cnt = 1;
    scanf("%lld", &num);

    // 8진수를 10진수로 변환
    while (num != 0)
    {
        dex_num += (num % 10) * cnt;
        num /= 10;
        cnt *= 8;

    }

    cnt = 1;
    // 10진수를 2진수로 변환
    while (dex_num != 0)
    {
        binary_num += (dex_num % 2) * cnt;
        dex_num /= 2;
        cnt *= 10;
    }

    printf("%lld", binary_num);

    return 0;
}

정상 문제 풀이


#include <stdio.h>

int main(void) {
    char octal[333335];
    scanf("%s", octal);  // 8진수 입력

    int i = 0;
    // 첫 번째 자리가 0인 경우를 제외하고는 반드시 1로 시작해야 하므로
    // 첫 번째 자리를 이진수로 변환하여 출력
    switch (octal[0]) {
        case '0':
            printf("0");
            break;
        case '1':
            printf("1");
            break;
        case '2':
            printf("10");
            break;
        case '3':
            printf("11");
            break;
        case '4':
            printf("100");
            break;
        case '5':
            printf("101");
            break;
        case '6':
            printf("110");
            break;
        case '7':
            printf("111");
            break;
    }

    // 나머지 자리들을 이진수로 변환하여 출력
    for (i = 1; octal[i] != '\0'; i++) {
        switch (octal[i]) {
            case '0':
                printf("000");
                break;
            case '1':
                printf("001");
                break;
            case '2':
                printf("010");
                break;
            case '3':
                printf("011");
                break;
            case '4':
                printf("100");
                break;
            case '5':
                printf("101");
                break;
            case '6':
                printf("110");
                break;
            case '7':
                printf("111");
                break;
        }
    }

    return 0;
}

시간 초과된 문제 풀이를 보면 8진수 최대 길이는 333,334자리인데, 이는 83333334-1 = 2^1000002-1이 된다.
long long int의 범위는 일반적으로 -2^63 (-9,223,372,036,854,775,808) ~ 2^63 - 1(9,223,372,036,854,775,807)이여서, long long 타입으로는 받을 수 없다.

  • 1 ~ 7의 숫자를 2진수로 나타낸 경우의 수로 표현해 각 자리수당 끊어가며 출력하는 방식을 사용했다.