[SWEA][D2] 5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수 D2 (16=>2)
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
T = 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 다른 풀이
T = 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 다른 풀이 주석 상세히
T = 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='')
T = int(input())
for tc in range(1,T+1):
N,S = input().split()
print('#{}'.format(tc),end=' ')
for i in range(0, int(N)): #길이만큼
ten=int(S[i],16) # 16진수를 10진수로 바꾸기
bbb(ten)
print()
|