본문 바로가기

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

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

 10진수의 소수를 2진수로 표현하기 - 파이썬

📌 문제출처

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

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

 

[문제 설명]

0보다 크고 1미만인 십진수 N을 이진수로 바꾸려고 한다.

예를 들어 0.625를 이진 수로 바꾸면 0.101이 된다.

N = 0.625

0.101 (이진수)

= 1*2-1 + 0*2-2 + 1*2-3

= 0.5 + 0 + 0.125

= 0.625

 

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

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

 

[입력]

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

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

3
0.625
0.1
0.125

 

[출력]

#1 101
#2 overflow
#3 001

 


💡 PASS

[파이썬 코드]

 

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
#  5186. [파이썬 S/W 문제해결 구현] 1일차 - 이진수2 D2
for tc in range(1int(input())+1):
    val = float(input())  # 10진수 소수를 입력받아야하니 float
    ret = [] # 2진수로 변환, 각자리를 문자열로 
    S=['9','9'# S[0] 앞자리, S[1] 뒤자리 일단, 임의의 수로 넣음
   
    # 소숫점 뒷자리가 0이고 2진수된 길이가 12까지
    while( S[1!= '0' and len(ret)<=12):
        # 2를 곱해서 
        val = val * 2
        # print(val)
        # 소숫점 앞 뒤로 쪼개 분리하기
        S = str(val).split('.')
        # 소숫점 앞 모으기(순서대로 2진수)    
        ret.append(S[0]) # 문자형태로 소숫점 앞 배열에 쌓기
        # 소숫점 뒤 0이 될때까지 다시 반복
        val = float('0.'+S[1])
        # print(len(ret))
    if len(ret) >= 13:
        # 13자리 이상이 필요한 경우에는 ‘overflow’를 출력
        print('#{} overflow'.format(tc))
    else:
        # 12자리 이내인 이진수로 표시할 수 있으면 0.을 제외한 나머지 숫자를 출력
        print("#{}".format(tc),''.join(ret))  
 
 

👀 [소감]

얼마만에 푸는거지.. 진짜 바닥부터 했네.. 10진수를 2진수로 바꾸는 것부터 공부했다...

https://blog.naver.com/chanseong1/221512567219

 

소숫점 앞부분은 나누기, 소숫점 뒷부분은 곱하기, 그리고 어떤 순서대로 2진수 배열하는지...

17번째 줄, 문자열에서 '0.' + 로 하는 것을 기피했는데 (시간 때문에) 12번 정도라서 그냥 했고, 

str 과 float 변환을 사용하였다.  

 

✍ [추가학습] 2진수를 10진수로 바꾸기 (소수점 포함)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# # 2진수를 10진수로 바꾸기 (소숫점포함)
 
def btod(binary): # 2진수를 넣었을 때
    # 변환 할 10진수, 초기값 0
    decimal = 0
    # 소숫점을 기준으로 분할(문자열로)
    S = str(binary).split('.')
    front = S[0# 앞자리
    rear = S[1# 소숫점 뒷자리
 
    # 정수 부분 문자열의 각 자릿값에 2의 n 제곱형태로 가중치 계산 후, 합산
    for i,digit in enumerate(front):
        decimal += int(digit)*pow(2,len(front)-1-i)
 
    # 소수 부분 문자열의 각 자릿값에 2의 -n 제곱형태로 가중치 계산 후, 합산
    for i,digit in enumerate(front):
        decimal += int(digit)*pow(2,-1-i) # -(1+i)
 
    return decimal