[BAEKJOON] 백준 11816: 8진수, 10진수, 16진수 (C#)

2024. 8. 13. 10:08IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/11816

 

 

문제

정수 X가 주어진다. 정수 X는 항상 8진수, 10진수, 16진수 중에 하나이다.

8진수인 경우에는 수의 앞에 0이 주어지고, 16진수인 경우에는 0x가 주어진다.

X를 10진수로 바꿔서 출력하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 X가 주어진다. X는 10진수로 바꿨을 때, 1,000,000보다 작거나 같은 자연수이다. 16진수인 경우 알파벳은 소문자로만 이루어져 있다.

 

 

출력

첫째 줄에 입력받은 X를 10진수로 바꿔서 출력한다.

 

 

 

통과한 답안

namespace _11816
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            int answer = 0;

            if (input[0] == '0')
            {
                if (input[1] == 'x')
                {
                    answer = Convert.ToInt32(input, 16);
                }
                else
                {
                    answer = Convert.ToInt32(input, 8);
                }
            }
            else
            {
                answer = int.Parse(input);
            }

            Console.WriteLine(answer);
        }
    }
}

 

주어진 입력값이 8진수, 10진수, 16진수 중에 어떤 값인지 확인한 후에

10진수로 전환시켜서 출력하는 문제이다.

 

3가지 경우를 깔끔하게 나누는 것이 돋보이는 문제로

8진수와 16진수는 첫글자가 0으로 시작하므로 둘을 하나의 묶음으로 묶고

else로 10진수를 빼낼 수 있으며,

두번째 글자가 x인지 확인하여 16진수와 8진수로 나눌 수 있다.

 

C#의 경우에는 Convert(ToInt32(입력값, 표현된 진수))를 사용하여

간단하게 변환할 수 있는 문제로 직접 구현한다면 아래와 같이 구현할 수 있다.

 

8진수를 10진수로 변환하는 코드

static int EightToDec(string input)
{
    int answer = 0;
    int baseValue = 1;

    for (int i = input.Length - 1; i >= 0; i--)
    {
        int currentDigit = input[i] - '0';
        answer += currentDigit * baseValue;

        baseValue *= 8;
    }

    return answer;
}

 

8진수를 10진수로 변환하는 것은 각각의 숫자에 8의 거듭제곱을 곱해주면 되므로

각각의 자릿수에 올바른 8의 거듭제곱을 곱해서 더한 값을 구하면 된다.

 

16진수를 10진수로 변환하는 코드

static int HexToDec(string input)
{
    int answer = 0;
    int baseValue = 1;

    input = input.Substring(2);

    for (int i = input.Length - 1; i >= 0; i--)
    {
        char currentChar = input[i];

        if (currentChar >= '0' && currentChar <= '9')
        {
            answer += (currentChar - '0') * baseValue;
        }
        else
        {
            answer += (currentChar - 'a' + 10) * baseValue;
        }

        baseValue *= 16;
    }

    return answer;
}

 

16진수를 10진수로 변환하는 과정은 10진수를 넘어가는 값(a ~ f)을 추가로 계산해주면 된다.

또, 16진수는 0x로 시작되는 것으로 주어졌으므로, 주어진 입력값을 수정하여 0x를 없앤 후에

각 자릿수에 대해서 숫자라면 16의 거듭제곱을 곱해주고,

알파벳이라면 알파벳에 맞는 값(a = 10, b = 11, c = 12, d = 13, e = 14, f = 15)을 구하고

이에 16의 거듭제곱을 곱해주어서 더하면 된다.

 

위와 같이 제공되는 메서드가 아닌

직접 8진수와 16진수를 10진수로 변환하는 과정을 구현할 수 있었다.