[BAEKJOON] 백준 2605: 이진법 시계 (C#)

2024. 5. 30. 21:31IT/BaekJoon

문제 링크

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

 

 

문제

이진법 시계는 60초-60분-1시간 체계의 일반적인 시간을 이진수로 표시해주는 시계이다. 일반적으로는 3행 혹은 3열의 LED에 0 또는 1을 표시하여 시간을 표시하는 방식이 주로 쓰인다.

3열 방식은 위 왼쪽 그림과 같이 6행 3열로 이루어져 있다. 각 열은 왼쪽부터 차례대로 시간, 분, 초를 나타낸다. 각 행은 첫 행의 수는 2 5를 나타내고 그 아래 수는 24를, 그렇게 6행은 1까지의 값을 갖는다.

3행 방식은 위의 오른쪽 그림처럼 3행 6열로 이루어져 있다. 3열 방식과는 반대로 3개의 행이 각각 시간, 분, 초를 나타내며, 각 열은 1열이 2 5, 2열이 24, ... , 6열이 1을 나타낸다.

위의 시계는 두 경우 모두 10시 37분 49초이다.

시계를 읽는 방식은 두 경우 모두 행우선 좌->우로 읽는다.

예를 들어 10시 37분 49초를 나타내는 이진법 시계의 3열 방식은(위의 예제) 011001100010100011로 읽으며, 3행 방식은 001010100101110001로 읽는다.

문제에서는 1시간-60분-60초 형태에 맞는 올바른 시각 하나가 주어진다.

이제 이 시간을 이진법 시계에서의 방식으로 나타내고, 3열 방식과 3행 방식으로 읽는 프로그램을 작성하면 된다.

 

 

입력

첫 줄에 테스트 케이스의 수 N이 주어진다. (1<=N<=1000)

각 케이스마다 10진법에서의 시간, 분, 초로 나타낸 시각이 한 줄에 예제의 형식과 같이 주어진다.

 

 

출력

각 테스트 케이스마다, 3열 방식으로 읽은 이진법 시계의 시각과 3행 방식으로 읽은 이진법 시계의 시각을 공백으로 구분하여 출력한다. 각각 18개의 비트를 가져야 한다.

 

 

 

통과한 답안

using System.Text;

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

            for (int i = 0; i < n; i++)
            {
                string[] inputs = Console.ReadLine().Split(':');
                StringBuilder sb = new StringBuilder();
                int hour = int.Parse(inputs[0]);
                int minute = int.Parse(inputs[1]);
                int second = int.Parse(inputs[2]);

                string binaryHour = Convert.ToString(hour, 2).PadLeft(6, '0');
                string binaryMinute = Convert.ToString(minute, 2).PadLeft(6, '0');
                string binarySecond = Convert.ToString(second, 2).PadLeft(6, '0');

                for (int j = 0; j < binaryHour.Length; j++)
                {
                    sb.Append(binaryHour[j]);
                    sb.Append(binaryMinute[j]);
                    sb.Append(binarySecond[j]);
                }

                sb.Append(' ');
                sb.Append(binaryHour);
                sb.Append(binaryMinute);
                sb.Append(binarySecond);

                Console.WriteLine(sb.ToString());
            }
        }
    }
}

 

주어진 시간(시간:분:초)을 2진법으로 표시하는데,

3열 방식과 3행 방식의 두 방법으로 표시해야 한다.

 

3열의 경우에는 2의 5제곱에 해당하는 시, 분, 초, 2의 4제곱에 해당하는 시, 분, 초,

... , 2의 1제곱에 해당하는 시, 분, 초, 2의 0제곱에 해당하는 시, 분, 초

의 순으로 표시해야하고

 

3행의 경우에는 시, 분, 초를 각각 2진수 6자리 숫자로 표시해야한다.

 

이 문제를 해결하는 포인트는 주어진 시간을 2진수의 6자리 숫자로 표현하는 것인데,

이는 Convert.ToString(변환하려는 숫자, 2).PadLeft(6, '0') 을 통해서 구현하였다.

이는 변환하려는 숫자를 2진수로 변환하여 6자리로 표현하는데,

6자리가 되지 않는다면 왼쪽에 0을 넣는 코드이다.

 

이렇게 주어진 시간을 2진수의 6자리 숫자로 변경한 뒤에

3열과 3행으로 표현되도록 stringbuilder를 활용하여 구현하였다.