[BAEKJOON] 백준 2998: 8진수 (C#)

2024. 6. 7. 01:22IT/BaekJoon

문제 링크

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

 

 

문제

창영이는 여러 가지 진법을 공부하고 있다. 창영이는 어제 2진법을 배웠고, 오늘은 8진법을 배웠다. 이제, 2진법 수를 8진법 수로 변환하려고 한다.

창영이가 사용한 방법은 다음과 같다.

  1. 2진수의 길이가 3으로 나누어 떨어질 때 까지 수의 앞에 0을 붙인다.
  2. 그 다음, 3자리씩 그룹을 나눈다.
  3. 아래의 표를 참고해 8진수로 바꾼다.

2진수가 주어졌을 때, 창영이가 사용한 방법을 이용해 8진수로 바꾸는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 2진수가 주어진다. 이 수는 100자리 이내이고, 첫 번째 자리는 1이다.

 

 

출력

첫째 줄에 8진수를 출력한다.

 

 

 

통과한 답안

using System.Text;

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

            while (input.Length % 3 != 0)
            {
                input = input.PadLeft(input.Length + 1, '0');
            }

            string oct = MakeOct(input);
            Console.WriteLine(oct);
        }

        static string MakeOct(string input)
        {
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < input.Length; i += 3)
            {
                string now = input.Substring(i, 3);
                switch (now)
                {
                    case "000": sb.Append('0'); break;
                    case "001": sb.Append('1'); break;
                    case "010": sb.Append('2'); break;
                    case "011": sb.Append('3'); break;
                    case "100": sb.Append('4'); break;
                    case "101": sb.Append('5'); break;
                    case "110": sb.Append('6'); break;
                    case "111": sb.Append('7'); break;
                }
            }

            return sb.ToString();
        }
    }
}

 

2진수로 주어진 수를 8진수로 변환하는 코드를 작성하는 문제이다.

문제에서 시킨 방식을 따라서 코드를 작성하는 것이 포인트인데,

 

1. 길이가 3으로 나누어 떨어질 때까지 수의 앞(왼쪽에) 0을 붙이기

while (input.Length % 3 != 0)
{
    input = input.PadLeft(input.Length + 1, '0');
}

 

2. 3자리씩 그룹을 나누기

for (int i = 0; i < input.Length; i += 3)
{
    string now = input.Substring(i, 3);
}

 

3. 주어진 방식으로 8진수로 바꾸기

switch (now)
{
    case "000": sb.Append('0'); break;
    case "001": sb.Append('1'); break;
    case "010": sb.Append('2'); break;
    case "011": sb.Append('3'); break;
    case "100": sb.Append('4'); break;
    case "101": sb.Append('5'); break;
    case "110": sb.Append('6'); break;
    case "111": sb.Append('7'); break;
}

 

의 주어진 조건에 따라서 코드를 구현하는 것이 포인트인 문제였다.

swtich 문을 이용하여서 한 눈에 알아볼 수 있도록 구현한 것이 장점이라고 생각한다.

 

 

세 자리로 나눈 숫자를 가지고 8진수로 바꾸는 방법은

이외에도 두 가지를 더 생각해볼 수 있었는데,

 

1. ToInt32.Convert(숫자, 2)이용하기

for (int i = 0; i < input.Length; i += 3)
{
    int now = Convert.ToInt32(input.Substring(i, 3), 2);
    sb.Append(now.ToString());
}

 

위의 switch 문 대신에 Convert 메서드를 이용하는 방법으로

for 문을 위와 같이 수정하여 사용할 수 있다.

내장된 기능을 사용하긴 하지만, 훨씬 깔끔하게 구현할 수 있다.

 

2. 직접 숫자를 구하기

for (int i = 0; i < input.Length; i += 3)
{
    int now = int.Parse(input.Substring(i, 3));
    int result = now / 100 * 4 + ((now % 100) / 10 * 2) + now % 10;
    sb.Append(result.ToString());
}

 

위의 Convert의 메서드를 실제로 구현한 것으로,

세 자리로 나눈 2진수 숫자는 백의 자리가 4, 십의 자리가 2, 1의 자리가 1을 나타내므로,

이를 직접 구해서 result로 변환하여 sb에 추가하는 방식을 이용하였다.

 

이 방법을 사용하면 코드도 훨씬 간단해지며 내장 메서드를 사용하지 않고

세 자리로 표현된 2진수를 8진수로 변환할 수 있다.