[BAEKJOON] 백준 1864: 문어 숫자 (C#)

2024. 10. 30. 06:32IT/BaekJoon

문제 링크

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

 

 

문제

해류가 매우 느리고 바닥을 기어다니는 생물이 적은 바다 밑바닥에서만 발견되는 잔물결 무늬의 정체는 오랫동안 해양학자들에게 수수께끼였다. 하지만 최근의 연구 성과는 동물 언어학 분야에 일대 혁명을 불러왔다. 이 무늬의 정체는 바로 문어가 숫자를 적는 방법이라는 것이 해양 생물학자들에 의해 밝혀진 것이다. 학자들은 문어가 무엇을 세는 것인지는 아직 알 수 없지만, 수 표기법을 해독하는 데에는 성공했다.

뭍 위에 사는 이들에게는 문어가 쓰는 숫자와 그를 표현하는 잔물결 무늬가 매우 낯설 수밖에 없다. 따라서 연구자들은 다음과 같은 기호로 잔물결 무늬를 적기로 합의했다. 각 기호와 대응하는 숫자는 다음과 같다.

  • -는 0에 대응한다.
  • \는 1에 대응한다.
  • (는 2에 대응한다.
  • @는 3에 대응한다.
  • ?는 4에 대응한다.
  • >는 5에 대응한다.
  • &는 6에 대응한다.
  • %는 7에 대응한다.
  • /는 -1에 대응한다.

해양 신경학자들은 특히 음수를 나타내는 기호가 있다는 사실에 흥분하면서, 아직 걸음마 단계인 두족류 신경학이 이 발견을 계기로 크게 발전하기를 기대하고 있다.

당연히 문어의 수 체계는 8진법에 기반한다. 예를 들면 다음과 같다.

(@&는 2 × 82 + 3 × 8 + 6 = 158이다.

?/--는 4 × 83 + −1 × 82 + 0 × 8 + 0 = 1984이다.
/(\는 −1 × 82 + 2 × 8 + 1 = −47이다.

당신에게 주어진 문제는 문어 숫자를 입력 받아 십진수로 나타내는 것이다.

 

 

입력

한 줄에 하나씩 문어 숫자가 입력으로 주어진다. 각 숫자는 최소 한 개, 최대 여덟 개의 문어 숫자 기호로 이루어져있다. 입력으로 '#'이 들어오면 입력을 종료한다.

 

 

출력

입력 받은 문어 숫자에 대응하는 십진수를 한 줄에 하나씩 출력한다.

 

 

 

통과한 답안

namespace _1864
{
    internal class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string input = Console.ReadLine();

                if (input == "#")
                {
                    return;
                }

                Console.WriteLine(SymbolToOctal(input));
            }
        }

        static double SymbolToOctal(string input)
        {
            double number = 0;

            for (int i = 0; i < input.Length; i++)
            {
                if (input[i] == '/')
                {
                    number += -SymbolToNum(input[i]) * Math.Pow(8, input.Length - 1 - i);
                }
                else
                {
                    number += SymbolToNum(input[i]) * Math.Pow(8, input.Length - 1 - i);
                }
            }

            return number;
        }

        static int SymbolToNum(char c)
        {
            switch (c)
            {
                case '-': return 0;
                case '\\': return 1;
                case '(': return 2;
                case '@': return 3;
                case '?': return 4;
                case '>': return 5;
                case '&': return 6;
                case '%': return 7;
                default: return 1;
            }
        }
    }
}

 

문자열로 주어진 입력값을 팔진수의 숫자로 변환하는 문제이다.

각각의 문자에 따라서 대응하는 숫자가 주어지고, 이를 SymbolToNum을 통해서 변환하였다.

단, \의 문자는 이스케이프 문자이므로 아래와 같이 \\로 처리하였다.

case '\\': return 1;

 

또, -1의 경우(/)는 이 메서드가 아닌 팔진수 숫자로 변환하는 과정에서 처리하므로

이 메서드에서는 처리하지 않았으며, 기본 변환값은 1로 처리하였다.

 

이후에 SymbolToOctal 메서드를 통해서 변환된 숫자를 팔진수로 변환하는데,

-1의 경우를 여기서 처리하도록 하였으며, Math.Pow(8, x)를 이용하여

변환된 값을 팔진수로 계산할 수 있도록 구현하였다.