[BAEKJOON] 백준 13877: 이건 무슨 진법이지? (C#)

2024. 6. 17. 04:27IT/BaekJoon

문제 링크

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

 

 

문제

C, C++, Java와 같은 프로그래밍 언어에서는 사용자가 다양한 진법의 상수를 사용할 수 있도록 "접두 문자(Prefix characters)"라는 개념을 도입하고 있다.

8진법인 수를 표기하고 싶으면, "0(숫자 0)"을, 16진법은 "0x"를, 10진법은 아무런 표기를 하지 않아도 되는데, 이해를 돕기 위해 10진법 수 "4660"을 이 표기방법대로 8, 10, 16진법으로 표기한 예는 다음과 같다.

  • 8진법(Octal): 011064
  • 10진법(Decimal): 4660
  • 16진법(Hexadecimal): 0x1234

만약 이런 표기 방법이 없었다면, 컴파일러는 저 숫자가 8진법인지, 10진법인지, 16진법인지 알 길이 없다. 0x1234에서 "0x"라는 접두 문자가 빠지면 사용자가 16진수로 표기했지만, 컴파일러는 이를 16진수가 아닌 8진수, 10진수로 인식할 수도 있다는 소리다.

이러한 오류가 발생했을 경우를 가정하여, 10진법으로 표현 가능한 숫자들로 구성된 문자열을 각각 8진수, 10진수, 16진수로 해석하는 프로그램을 작성하시오.

 

 

입력

첫 번째 줄에는 테스트 케이스를 나타내는 자연수 T(1 ≤ T ≤ 10000)이 주어진다. 이후 아래 2 ~ T + 1번째 줄에는 테스트 데이터의 번호를 나타내는 정수 K와 10진수로 표현된 문자열이 주어진다. 문자열의 길이는 7보다 작거나 같고, 0으로 시작할 수 있다.

 

 

출력

각각의 테스트 데이터마다 테스트 데이터의 번호 K와 8진법, 10진법, 16진법으로 나타낸 수를 공백으로 구분하여 출력한다. 만약 입력된 문자열이 8진수로 해석될 수 없는 경우에는 0을 출력한다.

 

 

 

통과한 답안

namespace _13877
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int T = int.Parse(Console.ReadLine());

            for (int i = 0; i < T; i++)
            {
                string[] inputs = Console.ReadLine().Split(' ');
                string[] answer = new string[3];
                int ten = int.Parse(inputs[1]);

                answer[0] = IsEight(inputs[1]) ? Convert.ToInt32(inputs[1], 8).ToString() : "0";
                answer[1] = ten.ToString();
                answer[2] = Convert.ToInt32(inputs[1], 16).ToString();

                Console.WriteLine($"{i + 1} {answer[0]} {answer[1]} {answer[2]}");
            }
        }

        static bool IsEight(string number)
        {
            foreach (char c in number)
            {
                if (c > '7')
                {
                    return false;
                }
            }

            return true;
        }
    }
}

 

문자열로 주어진 수를 8진수, 10진수, 16진수로 변환하는 문제이다.

8진수의 경우에는 8이나 9가 문자에 있는 경우에는 표현할 수 없으므로 0을 출력한다.

이를 판단하기 위해서 number에 있는 각 문자가 8이나 9인지 확인하도록 IsEight을 구현하였고

그 외의 10진수는 문자열을 숫자로 바꾼 후에 다시 문자로 바꾸는 과정을 통해서

만약 0으로 시작되는 숫자도 0을 제거하도록 구현하였다.

16진수의 경우에는 주어진 문자를 16진수로 변환하도록 구현하였다.