백준
백준 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번 문제는 내 힘으로 쉽게 풀겠지