본문 바로가기

공부/백준\BeakJoon

[백준/BEAKJOON] 2089번 -2진수

반응형

https://www.acmicpc.net/problem/2089

 

2089번: -2진수

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 110

www.acmicpc.net

 

 

문제

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.

10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오.

 

숫자 -32 16 -8 4 -2 1
1           1
2       1 1 0
3       1 1
4       1 0 0
5       1 0 1
6   1 1   1  
7   1 1   1 1
8   1 1      
9   1 1     1

-13 = -2 x 7 + 1

7 = -2 x -3 + 1

-3 = -2 x 2 + 1

2 = -2 x -1 + 0

-1 = -2 x 1 + 1

1 = -2 x 0 + 1

=> 110111

 

-4 = -2 x 2 + 0

2 = -2 x -1 + 0

-1 = -2 x 1 + 1

1 = -2 x 0 + 1

=> 1100

 

-1 = -2 x 1 + 1

1 = -2 x 0 + 1

 

나눠주는 값을 확인해보았다.

print(-13//-2)
print(13//-2)
print(-13//2)
print(-13/-2)
print(13/-2)
print(-13/2)

근데, 이제 값이 각각 6, -7, -7이 나오는 것을 확인했다.

print(-13%-2)
print(13%-2)
print(-13%2)

이 값은 -1, -1, 1이 나온다. 근데 다행이도, 우리는 계속 -2로 나눠줄 것이기 때문에 신경쓸 일이 없다!

 

삽질

 

+ 오래 걸렸는데, 그 이유가,, 나는 -1이 1이고,, 그런건줄 알았다.. -2가 110이고,, 그래서 굉장히 헷갈렸는데, 그냥 글을 잘못 읽은 것,, 나는 바보,,

 

+ 틀렸습니다 이유로는 0을 넣어줬을 때의 처리가 없었다.

 

 

 

정답 코드

num = int(input())
result = ''

if(num == 0):
    print("0")
else:
    while (num):
        if ((num % (-2)) == 0):
            num = num // -2
            result = '0' + result
        else:
            result = '1' + result
            num = num // -2 + 1

    print(result)


 

반응형