[C]백준_2704 : 이진법 시계

Alal11·2023년 3월 10일
0
post-thumbnail

출처

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개의 비트를 가져야 한다.


예제 입출력


알고리즘 분류

  • 구현

➡️문제 분석

10진수를 2진수로 변환하는 것, 열과 행의 구분을 할 줄 아는 것이 포인트


➡️코드(⭕)

#include <stdio.h>

void Binary(int arr[], int n)			// 10진수를 2진수로 변환하는 함수 선언
{
	// n을 2로 나눈 나머지를 arr배열에 넣고 그 몫을 다시 2로 나눈다.
	// 더이상 2로 나눌 수 없을때까지 위 과정을 반복하면 2진수를 구할 수 있다.
	int i = 0;
	while (n > 0)
	{
		arr[i] = n % 2;
		n /= 2;
		i++;
	}
}


int main()
{
	int N;
	int h, m, s;
	int i, j;

	scanf("%d", &N);

	for (j = 0; j < N; j++)
	{
		scanf("%d:%d:%d", &h, &m, &s);		// 시간, 분, 초를 입력한다.

		// 시간과 분, 초의 2진수를 담을 배열을 생성하고 0으로 초기화 시켜준다.
		// 크기가 6인 이유는 6행 3열 또는 3행 6열로만 이루어져 있어서 무조건 6자리로만 나오기 때문
		int bin_h[6] = { 0 };
		int bin_m[6] = { 0 };
		int bin_s[6] = { 0 };

		// 시간, 분, 초를 각각 2진수로 변환하는 함수를 적용시켜 각 배열에 넣어준다.
		Binary(bin_h, h);
		Binary(bin_m, m);
		Binary(bin_s, s);

		// 3열 방식으로 읽은 경우 출력
		for (i = 5; i >= 0; i--)
			printf("%d%d%d", bin_h[i], bin_m[i], bin_s[i]);
		
		printf(" ");

		// 3행 방식으로 읽은 경우 출력
		for (i = 5; i >= 0; i--)
			printf("%d", bin_h[i]);
		for (i = 5; i >= 0; i--)
			printf("%d", bin_m[i]);
		for (i = 5; i >= 0; i--)
			printf("%d", bin_s[i]);

		printf("\n");
	}
	return 0;
}

➡️코드 분석

  1. 2진수로 변환하는 함수 Binary를 선언하고, 2진수를 담을 배열 arr과 10진수 n을 매개변수로 설정 한다.

  2. n을 2로 나눈 나머지를 arr 배열에 넣고 그 몫을 2진수로 다시 나누는 과정을 더이상 2로 나눌 수 없을때까지 반복하면 arr 배열에 2진수로 변환한 값이 담아진다.

  3. main 함수로 와서 테스트 케이스의 수 N을 입력받고, N만큼 반복문을 돌려준다.

  4. 시간, 분, 초를 입력 받고, 이것의 2진수를 담기 위해 크기가 6인 배열을 각각 선언해준다.

  5. Binary 함수를 호출하여 시간, 분, 초의 배열과 값을 각각 매개변수로 넣어준다.

  6. 3열 방식으로 읽은 경우와 3행 방식으로 읽은 경우를 공백을 두고 출력한다.


➡️end

엄청 어렵게 느껴졌지만 생각보단 간단한 문제였다.

0개의 댓글