본문 바로가기

Algorithm Problem Solving/SWExpertAcademy

Programming Advanced [파이썬 S/W 문제해결 구현01 시작하기] SWEA 5185 - 이진수 (D2)

Problem

16진수 1자리는 2진수 4자리로 표시된다.

N자리 16진수가 주어지면 각 자리 수를 4자리 2진수로 표시하는 프로그램을 만드시오.

단, 2진수의 앞자리 0도 반드시 출력한다.

예를 들어 47FE라는 16진수를 2진수로 표시하면 다음과 같다.

0100011111111110


[입력]

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 자리 수 N과 N자리 16진수가 주어진다. 1<=N<=100

16진수 A부터 F는 대문자로 표시된다.
 
[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

 

Solving

아이디어
  1. 16진수를 한자리씩 계산한다. (ex: 4, 7, F, E)
  2. 16진수 숫자를 10진수로 변환한다. (4, 7, 15, 14)
    ord() 함수 : 문자의 아스키코드값을 반환한다.
    ord('0') - ord('0') = 0
    ord('9') - ord('0') = 9
    ord('A') - ord('A') + 10 = 10
    ord('F') - ord('A') + 10 = 15
  3. 10진수 숫자를 2진수로 변환한다. (0100, 0111, 1111, 1110)
    16진수 하나를 10진수로 바꾸었기 때문에 2진수 기준 자리수는 4자리
    2^3, 2^2, 2^1, 2^0 으로 각각 계산
    binary <- n을 2^power로 나눈 몫 
    n을 2^power로 나눈 나머지로 n을 갱신
코드
# 16진수 -> 10진수
def hex_to_decimal(n):
    if ord('0') <= ord(n) <= ord('9'):
        return ord(n) - ord('0')
    return ord(n) - ord('A') + 10


# 10진수 -> 2진수
def decimal_to_binary(n):
    binary = ''
    for power in range(3, -1, -1):
        binary += str(n // (2**power))
        n %= (2**power)
    return binary


for tc in range(1, int(input()) + 1):
    N, in_num = input().split()
    N = int(N)

    result = ''
    for num in in_num:
        # 16진수 -> 10진수 -> 2진수 -> 합치기
        result += decimal_to_binary(hex_to_decimal(num))

    print('#{} {}'.format(tc, result))