[BAEKJOON] 백준 2605: 이진법 시계 (C#)
문제 링크
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를 활용하여 구현하였다.