코딩테스트/SWExpertAcademy

이진수2 Python(SW Expert Academy)

멍토 2020. 5. 15.

난이도 : D2

문제번호 : 5186

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDYSqAAbw5UW6&subjectId=AWUYDLaK1kMDFAVT

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


 

목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

0보다 크고 1미만인 십진수 N을 이진수로 바꾸려고 한다. 예를 들어 0.625를 이진 수로 바꾸면 0.101이 된다.

N을 소수점 아래 12자리 이내인 이진수로 표시할 수 있으면 0.을 제외한 나머지 숫자를 출력하고,

13자리 이상이 필요한 경우에는 ‘overflow’를 출력하는 프로그램을 작성하시오.

 

입력

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

다음 줄부터 테스트 케이스의 별로 소수점 아래가 12자리 이내인 N이 주어진다.

출력

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

예시

입력 출력
3
0.625
0.1
0.125
#1 101
#2 overflow
#3 001

2. 문제풀이

이번 문제는 십진수로 이루어진 소수를 이진수로 변환하는 문제였다.

문제를 보면 1* 2^-n을 뺏을때 음수로 내려가지 않는다면 1을 추가하는 형식으로 보인다.

위의 예시는 n이 -1인경우 빼는게 가능해서 1이고 -2인 경우는 빼면 음수로 내려가게 되서 0이된다.

12번 반복했을때 입력받은 N에 값이 남아있다면 13자리 이상이므로 overflow를 출력한다.


3. 소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#D2 5186 이진수2
 
for t in range(int(input())):
    #결과 저장 변수
    answer = ''
    #계산해야 하는 숫자 받기
    number = float(input())
    #나누기 위한 값
    sub_num = 1
    #최대 12자리까지 출력
    for _ in range(12):
        #진행이 될수록 크기는 반절이 된다.
        sub_num *= 0.5
        #값을 빼보았을때 0보다 크다면 뺀고 결과출력
        if number - sub_num >= 0:
            answer += '1'
            number -= sub_num
            #숫자가 나눠떨어졌다면 반복문 종료
            if not number:
                break
        else:
            #계산이 안된다면 0추가
            answer += '0'
    #모든 반복문이 끝났는데 값이 남아있다면 overflow 넣기
    if number: answer = 'overflow'
    print('#{} {}'.format(t+1, answer))

댓글

💲 광고입니다.