코딩테스트 \파이썬\자바/SWEA D2

[SWEA][D2] 5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수 D2 (16=>2)

익명의 신디 2020. 4. 29. 23:51

16진수를 2진수로 표현하기

문제출처

 

📖 5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수

 

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는 대문자로 표시된다.

3
4 47FE
5 79E12
8 41DA16CD


 
[출력]

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

#1 0100011111111110
#2 01111001111000010010
#3 01000001110110100001011011001101

💡 PASS

💡 [파이썬 코드 1]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
# 5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수 D2
# 1
= int(input())
for tc in range(1,T+1):
    N,S = input().split()
    ten=int('0x'+S,16# 16진수를 10진수로 바꾸기
    #print(ten)
    b = format(ten,'b'# 10진수를 2진수로 바꾸기
    if len(b) < int(N)*4# 첫자리가 0인경우는 안보이니 계산해서 붙여주기
        b = '0'+b
 
    print('#{} {}'.format(tc,b))
 
 

 

16진수를 2진수로 바꾸기 위해서,

16진수 -> 10진수

10진수 -> 2진수

로 바꾸어주는 파이썬 내장함수를 이용하였다.

 

6번째 식에 int(S,16) 으로 해도 16진수를 10진수로 바꾸어준다. 0x 진수를 나타내는 접두어를 안붙어도 16진수인지 찰떡같이 알아보고 10진수로 변환해주였다. 

8번째 식 format(숫자,'b') 는 10진수(숫자)를 2진수('b') 로 바꾸어준다. 'o' 는 8진수 'x' 는 16진수이다. 

 

출력에 접두어가 붙지 않도록 format를 사용했는데, 생각해보니 bin()함수를 써서 나온 값을 슬라이스[2:] 해줘도 될 듯

참고 : https://brownbears.tistory.com/467

 

[Python] 2진수, 8진수, 10진수, 16진수 변환

먼저 파이썬은 기본 10진수이기 때문에 다른 진수는 아래와 같이 접두어가 붙습니다. 2진수: 0b 8진수: 0o 16진수: 0x 10진수에서 2진수, 8진수, 16진수 변환 bin(), oct(), hex() 내장함수 사용 파이썬에서 제공..

brownbears.tistory.com


💡 [파이썬 코드 2]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수 D2
 
# 2 다른 풀이
= int(input())
for tc in range(1, T + 1):
   N, S = input().split()
    N = int(N)
    ans = ''
    for digit in S:
        if ord(digit) >= ord('A'):
            digit = ord(digit) - ord('A'+ 10
        else:
            digit = int(digit)
        tmp = ''
        while digit > 0:
            tmp = str(digit % 2+ tmp
            digit //= 2
        if len(tmp) <= 4:
            tmp = '0' * (4 - len(tmp)) + tmp
        ans += tmp
    print('#{} {}'.format(tc, ans))
 
 

 

=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수 D2
 
# 2 다른 풀이 주석 상세히
= int(input())
for tc in range(1, T + 1):
    N, S = input().split() # 좋은것을 배웠다
    # N은 필요없다 글자수의 개수 따위
    ans = '' # 2진수 전체 자리별 모음
    for digit in S: # 16진수의 각 자리는
        # 16진수 각자리를 10진수로 변환 
        if ord(digit) >= ord('A'): # ord('A) = 65 이므로, 문자(A~F)
            digit = ord(digit) - ord('A'+ 10 # (10~15)
        else:
            digit = int(digit) # (0~9)
        # 10진수를 2진수로 변환
        tmp = '' # 각 자리의 2진수
        while digit > 0:
            tmp = str(digit % 2+ tmp # 나머지 모으기
            digit //= 2 # 몫은 계속 나누기
        if len(tmp) <= 4# 16진수 1자리<==> 2진수 4자리를 차지
            tmp = '0' * (4 - len(tmp)) + tmp # 앞에 0을 붙여주기
        ans += tmp # 4자리의 2진수를 덮붙이기
    print('#{} {}'.format(tc, ans))
 
 

 

 


💡 [파이썬 코드 3]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수 D2
 
# 3 비트연산 이용
 
def bbb(val):
    for i in range(4):
        if val&(8>>i):
            print('1',end='')
        else:
            print('0',end='')
            
= int(input())
for tc in range(1,T+1):
    N,S = input().split()
    print('#{}'.format(tc),end=' ')
    for i in range(0int(N)): #길이만큼
        ten=int(S[i],16# 16진수를 10진수로 바꾸기
        bbb(ten)
    print()