본문 바로가기

Algorithm

SWEA 5186 이진수2 (python)

반응형

[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