[백준] 2089번 -2진수 - Python / 알고리즘 기초 1/2 - 수학 1 (연습)

ByungJik_Oh·2025년 3월 25일
0

[Baekjoon Online Judge]

목록 보기
35/244
post-thumbnail



💡 문제

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

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

입력

첫 줄에 10진법으로 표현된 수 N이 주어진다.

출력

-2진법 수를 출력한다.


💭 접근

진법 변환의 원리를 이해하고 적용하는 문제이다.

ex)
만약 10진수 '7'을 2진수로 변환한다면,
7=2×7 = 2 \times 33 +1+ 1 (20^0 자리)
33 =2×= 2 \times 11 +1+ 1 (21^1 자리)
11 =2×0+1= 2 \times0+ 1 (22^2 자리)
이므로 7 -> 111이 된다.

위와 같은 원리를 -2진수에 그대로 적용하게 되면,

ex) 예제
만약 10진수 '-13'을 -2진수로 변환한다면,
(13)=(2)×(-13) = (-2) \times 77 +1+ 1 (20^0 자리)
77 =(2)×= (-2) \times (3)(-3) +1+ 1 (21^1 자리)
(3)(-3) =(2)×= (-2) \times 22 +1+ 1 (22^2 자리)
22 =(2)×= (-2) \times (1)(-1) +0+ 0 (23^3 자리)
(1)(-1) =(2)×= (-2) \times 11 +1+ 1 (24^4 자리)
11 =(2)×0+1= (-2) \times 0 + 1 (25^5 자리)

이렇게 -2진수를 쉽게 구할 수 있다.


📒 코드

n = int(input())

if n == 0:
    print(0)
else:
    ans = ''
    while n:
        if n % -2 == 0: # 나머지가 0이라면 그대로 나누기
            n //= -2
            ans += '0'
        elif n % -2 == -1: # 나머지가 -1이라면
            n -= 1 # 그냥 나누면 몫이 1만큼 작아지므로 -1한 후 나누기
            n //= -2
            ans += '1'
        elif n % -2 == 1: # 나머지가 1이라면
            n //= -2
            ans += '1'

    print(ans[::-1])

💭 후기

진법 변환하는 원리를 공부하고 풀었지만 '-'부호 때문에 자칫 잘못하면 실수하기 쉬운 문제인것 같다.


🔗 문제 출처

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


profile
精進 "정성을 기울여 노력하고 매진한다"

0개의 댓글