백준

백준 2745번 c#

대왕군 2024. 1. 24. 20:09

 

using System;

namespace Baekjoon
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //그냥 콘솔창 예쁘게 꾸미는 코드(심심해서 넣음)
            Console.BackgroundColor = ConsoleColor.DarkCyan;

            //입력값 받아옴
            string input = Console.ReadLine();

            // 입력값을 공백으로 분리
            string[] inputParts = input.Split(' ');

            // 입력값이 충분한지 확인
            if (inputParts.Length == 2)
            {
                string number = inputParts[0];
                //몇 진수인지 받아올 변수
                int baseFrom;

                // 진법을 정수로 파싱, 이후 파싱 성공 시 baseFrom변수에 정수 반환
                if (int.TryParse(inputParts[1], out baseFrom))
                {
                    // 10진법으로 변환
                    int result = ConvertToDecimal(number, baseFrom);

                    // 결과 출력
                    Console.WriteLine(result);
                }
            }

        }

        //n진수를 10진수로 변환하는 메소드
        static int ConvertToDecimal(string number, int baseFrom)
        {
            //반환할 결과값 변수
            int result = 0;
            //몇 제곱 할건지 정할 변수
            int power = 0;

            // 입력된 숫자를 뒤에서부터 읽어가며 10진법으로 변환
            for (int i = number.Length - 1; i >= 0; i--)
            {
                //각자리수 숫자(혹은 대문자 알파벳)을 저장할 변수
                char digit = number[i];
                //계산한 값들을 임시로 저장할 변수
                int value;

                // 문자를 숫자로 변환
                //digit변수에 들어있는 값이 숫자인지 문자인지 판단함
                //숫자이면 True, 아니면 False임
                if (Char.IsDigit(digit))
                {
                    //공식 : 문자숫자에서 '0'을 빼면 실제 문자숫자의 정수값이 나온다
                    //예시 : '8' - '0' = 8
                    //'8'의 아스키코드는 56, '0'의 아스키코드는 48이다
                    //56 - 48은 8이 나오게 되는 원리이다
                    value = digit - '0';
                }
                else
                {
                    // 알파벳의 경우 A=10, B=11, ..., F=15로 변환
                    //공식 : 문자 - 'A' + 10을 하면 그 문자에 맞는 정수값이 나온다
                    //예시 : 'B' - 'A' + 10 = 11
                    //'B'는 66이고 'A'는 65이다, 66 - 65 + 10 = 11 이며 11은 B를 나타내는 숫자이다
                    value = Char.ToUpper(digit) - 'A' + 10;
                }

                // 현재 자릿수의 값을 10진법으로 더함
                //공식 : 1111이 2진수라고 쳤을때 10진법으로 변환하는 방법은 다음과 같다
                //(1*2^3) + (1*2^2) + (1*2^1) + (1*2^0)
                //(1*2^3)에서 1은 자리값을 의미하고 2는 현재 진수의 값, ^3은 자리값에 따른 제곱값이다
                //(이 공식은 다른 n진수를 10진수로 변환할때도 같음)
                result += value * (int)Math.Pow(baseFrom, power);
                //자리에 따라 제곱값이 1씩 커지기 때문에 power에 +1을 해준다
                power++;
            }
            //결과 반환
            return result;
        }

    }
}

 

난 이때까지 풀었던 문제중에 이 문제가 가장 어려웠던 것 같다

왜냐하면 n진수를 10진수로 변환하는 방법을 몰랐기 때문이다

이 공식을 인터넷 검색으로 알아냈지만 문제해결에 어려움을 겪었고

결국 chat gpt의 힘을 빌려 코드를 받고 코드를 해석해보았다

 

//공식 : 문자숫자에서 '0'을 빼면 실제 문자숫자의 정수값이 나온다
//예시 : '8' - '0' = 8
//'8'의 아스키코드는 56, '0'의 아스키코드는 48이다
//56 - 48은 8이 나오게 되는 원리이다

이런 공식이 있었는데 chat gpt가 알려주기 전에는 이 공식을 몰라서 코드를 제대로 짜지 못했다

내가 왜 이 방법을 생각하지 못했나 한탄스럽다

 

그래도 뭐, 이 문제 푸는 법을 알았으니 비슷한 문제로 보이는 11005번 문제는 내 힘으로 쉽게 풀겠지