-- 예전 기록/BOJ

[ BOJ ] 1550 : 16진수 ( BRONZE 2 ) / C, Python

rejo 2023. 11. 10. 10:50

문제

16진수 수를 입력받아서 10진수로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 16진수 수가 주어진다. 이 수의 최대 길이는 6글자이다. 16진수 수는 0~9와 A~F로 이루어져 있고, A~F는 10~15를 뜻한다. 또, 이 수는 음이 아닌 정수이다.

출력

첫째 줄에 입력으로 주어진 16진수 수를 10진수로 변환해 출력한다.

풀이 과정

16진수 수를 10진수로 변환하는 방식을 사용하여 풀이한다. 우리가 일상생활에서 사용하는 10진수는 (뒤에서 1번째 자리) x 1 + (뒤에서 2번째 자리) x 10 + (뒤에서 3번째 자리) x 100 + (뒤에서 4번째 자리) x 1000 ... 인 것처럼, 16진수는 (뒤에서 1번째 자리) x 1 + (뒤에서 2번째 자리) x 16 + (뒤에서 3번째 자리) x 16^2 + (뒤에서 4번째 자리) x 16^3 ... 이다.

C

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

int main(void) {
    char num[10];
    scanf("%s", num);

    int result = 0;
    for (int i = 0; i < strlen(num); i++) {
        result *= 16;
        if ('A' <= num[i] && num[i] <= 'F') result += num[i] - 'A' + 10;
        else result += num[i] - '0';
    }

    printf("%d", result);
    return 0;
}

16진수 수를 10진수 수로 변환하는 방식을 이용하여 출력하거나,

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

int hexa(char num[10], int now) {
    if (now == 1) {
        if ('A' <= num[0] && num[0] <= 'F') return num[0] - 'A' + 10;
        else return num[0] - '0';
    }
    else {
        if ('A' <= num[now - 1] && num[now - 1] <= 'F') return hexa(num, now - 1) * 16 + num[now - 1] - 'A' + 10;
        else return hexa(num, now - 1) * 16 + num[now - 1] - '0';
    }
}

int main(void) {
    char num[10];
    scanf("%s", num);

    printf("%d", hexa(num, strlen(num)));
    return 0;
}

이 변환 과정을 재귀 함수로 작성하여 출력하거나,

#include <stdio.h>

int main(void) {
    int a;
    scanf("%X",&a);
    printf("%d",a);
    return 0;
}

처음부터 16진수 서식문자로 입력받아서 10진수 수로 출력할 수 있다.

Python

print(int(input(), 16))