반응형
[toc]
5186. [파이썬 S/W 문제해결 구현] 1일차 - 이진수2 D2
문제
0보다 크고 1미만인 십진수 N을 이진수로 바꾸려고 한다. 예를 들어 0.625를 이진 수로 바꾸면 0.101이 된다.
N = 0.625
0.101 (이진수)
= 1x2^-1 + 0x2^-2 + 1x2^-3
= 0.5 + 0 + 0.125
= 0.625
N을 소수점 아래 12자리 이내인 이진수로 표시할 수 있으면 0.을 제외한 나머지 숫자를 출력하고, 13자리 이상이 필요한 경우에는 ‘overflow’를 출력하는 프로그램을 작성하시오.
[입력]
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 소수점 아래가 12자리 이내인 N이 주어진다.
[출력]
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
풀이과정
- 기본적인 원리
- 2의 -승을 반복하여 시행하며 계속 빼주는 원리
- 값이 0보다 작아지지 않게 유지하며 시행
- 0이 될경우에는 결과값이 반환됨
- 12번이 넘어갈 경우에는 overflow가 실행됨
하면서 착각했던 부분이 일반적인 이진수 처럼 앞에다가 더해주려고 했던 부분이다.
이것은 음수로 나타내는 이진수 였기에 반대로 실행하여 그냥 뒤에 붙여주는 개념일 것이다.
why? 당연히 2^-1이 2^-2보다 크니까
풀이
T = int(input())
# 바꿔주는 함수
def binary_chane(n):
# 몇번 바꿨는지 세줄 변수 초기화
cnt = 0
# 결과값 초기화
result = ''
# 2진법 자리수 시작
a = 1
# n이 0이 될때까지 돌린다.
while n:
# 만약 n보다 2진법 자리가 크다면 0을 붙인다.
if n < 2**-a:
result += '0'
# 아니라면 1을 붙인다.
else:
n -= 2 ** -a
result += '1'
# 붙이고 나서 횟수를 더해준다.
cnt += 1
# 만약 12회가 넘어간다면 overflow로 끝낸다.
if cnt > 12:
return 'overflow'
# 아니라면 다음 자리수를 봐보자
else:
a += 1
# 12자리까지 딱 나누어 떨어졌으면 결과값을 반환하자
return result
for tc in range(1, T+1):
N = float(input())
print("#{} {}".format(tc, binary_chane(N)))
반응형
'Algorithm' 카테고리의 다른 글
SWEA 5177 이진 힙 (python) (0) | 2021.04.13 |
---|---|
SWEA 10729 이진수 표현 (python) (0) | 2021.04.13 |
SWEA 5185 이진수 (python) (0) | 2021.04.13 |
SWEA 1240 단순 2진 암호코드 (python) (0) | 2021.04.13 |
SWEA 5178 노드의 합 (python) (0) | 2021.04.11 |