2024. 5. 30. 21:31ㆍIT/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를 활용하여 구현하였다.
'IT > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 백준 1065: 한수 (C#) (0) | 2024.05.31 |
---|---|
[BAEKJOON] 백준 1064: 평행사변형 (C#) (0) | 2024.05.31 |
[BAEKJOON] 백준 2605: 줄 세우기 (C#) (0) | 2024.05.30 |
[BAEKJOON] 백준 2511: 카드놀이 (C#) (0) | 2024.05.30 |
[BAEKJOON] 백준 5724: 파인만 (C#) (0) | 2024.05.28 |