[C] 백준 2745번 진법 변환

김진웅·2023년 8월 25일
0

baekjoon-study

목록 보기
16/59
post-thumbnail

링크
https://www.acmicpc.net/problem/2745

문제

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

예제 입력 1

ZZZZZ 36

예제 출력 1

60466175



아이디어 스케치

  • B진법을 10진법으로 변환하는 방법은 B진법의 수 N을 1의 자리 부터 자릿값 X B^(자리인덱스)를 곱해서 다 더해주면 된다.
  • 예를 들어 16진수 AAAAA가 있으면 A의 자릿값은 11이고 1의 자리는 인덱스로 0이므로 11x16^0 + 11x16^1이런식으로 11x16^(5-1)까지 진행해서 더해주면 10진수로 변환이 가능하다.



코드 분할 설명

char input[10000];
int B;
int result = 0;

scanf("%s %d", input, &B);      //문자와 진법을 입력받음

int len = strlen(input);        //문자열 갯수 구하기
  • input은 int형이 아닌 char형으로 받아준다.
  • 진법 변환을 하기 위해서는 입력받은 char가 몇 자리인지 알아야 하므로 strlen을 이용하여 구해준다.



 for (int i = 0; i < len; i++) {
        int digit;
        if (input[i] >= '0' && input[i] <= '9') {
            digit = input[i] - '0';     //보기에는 숫자이지만 문자이므로 아스키 코드 연산을 이용해 숫자값을 구해야 됨
        }
        else if (input[i] >= 'A' && input[i] <= 'Z') {
            digit = input[i] - 'A' + 10;
        }
        
        result += digit * pow(B, len - 1 - i);      //진법 변환 식
    }
  • 여기서 digit은 자릿값을 의미한다.
  • input[i]-'0'은 아스키 코드 값의 연산을 이용해서 숫자를 구하는 과정이다. 여기서 입력된 input값은 숫자처럼 보이지만 문자이기 때문에 그대로 더하게 되면 아스키 코드 값끼리 더해지므로 이상한 값이 나온다. 그래서 input-'0'을 이용하여 아스키 코드 값을 숫자값으로 변환 해준 후 digit에 저장해야 한다.
  • input[i] -'A'+10도 마찬가지로 ABCDE와 같은 문자값을 11 12 13 14 15 로 변환해주는 식이다.
  • 여기서 인덱스 i가 0부터 시작하는데 인덱스 0은 가장 상위 비트로 B^(len-1)을 자릿값에 곱해주어야 하는데 이걸 일반화하면 digit*B^(len-1-i)이다. C언어 Math에서 제공하는 pow함수를 사용하였다.
  • pow함수는 (a,b) 형식으로 인자가 들어가며 a^b를 의미한다.



전체 코드

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

int main() {
    char input[10000];
    int B;
    int result = 0;

    scanf("%s %d", input, &B);      //문자와 진법을 입력받음

    int len = strlen(input);        //문자열 갯수 구하기

    for (int i = 0; i < len; i++) {
        int digit;
        if (input[i] >= '0' && input[i] <= '9') {
            digit = input[i] - '0';     //보기에는 숫자이지만 문자이므로 아스키 코드 연산을 이용해 숫자값을 구해야 됨
        }
        else if (input[i] >= 'A' && input[i] <= 'Z') {
            digit = input[i] - 'A' + 10;
        }
        
        result += digit * pow(B, len - 1 - i);      //진법 변환 식
    }

    printf("%d", result);

    return 0;
}



제출 결과

profile
IT Velog

0개의 댓글