WalkerJei's Lifelog

백준알고리즘 2745번 진법 변환 C# 본문

소프트웨어 개발/코딩테스트(기성 문제)

백준알고리즘 2745번 진법 변환 C#

WalkerJei 2025. 4. 21. 19:23

세부 정보

  • 사이트: 백준알고리즘
  • 번호: 2745
  • 문제명: 진법 변환
  • 언어: C#
  • 분류: 수학, 구현, 문자열
  • 비고: 

 

문제

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진법으로 출력한다.

 

풀이

아스키 코드로 0은 48, 9는 57, A는 65, Z는 90이다.

Math.Pow()를 사용해 제곱을 구할 수 있지만 실수인 double 형태로 값을 반환하므로 형 변환을 (int)로 해 주었다.

StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

// 특정 진법의 수를 10진수로 변환
int ToDecimal(string n, int b)
{
    // 특정 진법 상태의 수
    int[] before = new int[n.Length];
    // 진법 변환을 위한 수
    int[] bInfo = new int[n.Length];
    // 10진수로 바뀐 수
    int after = 0;

    for (int i = 0; i < n.Length; i++)
    {
        // 0부터 9까지의 수를 변환
        if (n[i] >= 48 && n[i] <= 57)
            before[i] = Convert.ToInt32(n[i]) - 48;
        // A(10)부터 Z(35)까지의 수를 변환
        if (n[i] >= 65 && n[i] <= 90)
            before[i] = Convert.ToInt32(n[i]) - 55;
        // 진법 변환을 위해 입력한 수 세팅
        bInfo[i] = (int) Math.Pow(b, n.Length - 1 - i);
    }

    // 10진수로 변환하는 과정
    for (int i = 0; i <n.Length; i++)
        after += (before[i] * bInfo[i]);
    // 변환한 10진수 반환
    return after;
}

// 특정 진법의 숫자와 진법을 입력받는다.
string input = sr.ReadLine();
// 특정 진법의 숫자를 추출해 저장한다.
string n = input.Split()[0];
// 진법 정보를 추출해 저장한다.
int b = Convert.ToInt32(input.Split()[1]);

// 10진법으로 변환한 수 출력
sw.WriteLine(ToDecimal(n, b));

sr.Close();
sw.Close();

 

후기

문제를 풀면서 의존도 단계가 생각났다.

1단계: 문제를 푼 언어로 된 답을 보고 배울 때

2단계: 다른 언어로 된 답을 보고 번역해서 배울 때

3단계: 답이 아니라 간접적인 힌트를 사용해서 배울 때

4단계: 간접적인 힌트는 없지만 자동완성을 사용해서 문제를 풀었을 때

5단계: 간접적인 힌트와 자동완성 없이 문제를 풀었을 때

 

예시:

1단계: C#으로 문제를 풀 때 다른 사람이 쓴 C# 코드에서 피드백을 받았다.

2단계: C#으로 문제를 풀 때 다른 사람이 쓴 Java 코드에서 피드백을 받고 C# 환경에 맞게 번역했다.

3단계: C#으로 문제를 풀 때 컴퓨터 과학 이론 서적, 기술 문서 등을 참조해서 답을 썼다.

4단계: C#으로 문제를 풀 때 머릿속에 있는 지식을 활용했지만 개발 환경의 자동완성 기능의 도움을 받았다.

5단계: C#으로 문제를 풀 때 머릿속의 지식을 활용하고, 자동완성 기능을 사용하지 않았다.

 

지금 이 문제를 풀었을 때 의존도 단계는 3이었다. 타인의 소스 코드를 보지는 않았지만 아스키 코드표를 인터넷 검색으로 참조했기 떄문이다. 코딩테스트 개발환경에 따라 5단계 정도의 수준이 필요할 때도 있다. 목표하는 단계는 적어도 4단계 이상은 되어야 한다. 이 외에도 Math.Pow()가 정수가 아니라 실수 상태의 값을 반환한다는 것을 확인하면서 충격받았다. 보통은 Math.Pow() 함수의 괄호 안에서 ,를 기준으로 앞에는 정수를 포함한 실수, 뒤에는 정수만 들어갈 수 있다고 생각했었다. 그런데 뒤에 정수가 아닌 실수도 들어갈 수 있어서 놀랐다. 2^3.3이 가능하다는 의미다.