[BOJ] 2089: -2진법

이슬비·2022년 6월 17일
0

Algorithm

목록 보기
45/110
post-thumbnail

장장 3시간 30분을 푼 문제...

2089: -2진법

1. 내 풀이 1: 실패

import sys

decimal = int(sys.stdin.readline())
minus_bin = ''

while decimal != (1 or -1):
    if decimal%2 !=0:
        decimal = (decimal-1)//-2
        minus_bin += '1'
    else:
        minus_bin += (str(decimal%-2))
        decimal = decimal//-2

if decimal == -1:
    minus_bin += '11'
else:
    minus_bin += str(decimal)

print(int(minus_bin[::-1]))

예외 처리가 정말 중요하다는 걸 깨닫게 해준 문제.
여기서 0에 대한 예외를 처리하지 않아서 결국 무한루프를 돌게 되었고 나는...

3번의 시간 초과 퇴짜를 받았다 ^^... 메모리 초과는 설마 이게 문자열로 처리해서 그런가 생각이 들어 리스트로 바꿨더니 간만에 만나게 되었다.

대부분 예외 처리를 최댓값이나 최솟값으로 하면 충분하기 때문에 (이전에 나는) 이번에는 아무 생각 없이 했더니...!
0에서 무한 루프를 돌게 된 것이다.

2. 내 풀이 2: 성공

import sys

decimal = int(sys.stdin.readline())
minus_bin = ''

while True:
    if decimal == 0:
        break
    if decimal == (1 or -1):
        break
    if decimal%2 !=0:
        decimal = (decimal-1)//-2
        minus_bin += '1'
    else:
        minus_bin += (str(decimal%-2))
        decimal = decimal//-2

if decimal == -1:
    minus_bin += '11'
else:
    minus_bin += str(decimal)

print(int(minus_bin[::-1]))

if 문을 통해 0을 처리해주었다.

신기하다고 해야하나? minus_bin이 현재 빈 문자열인데, 이를 int로 바꾸니까 0이 나왔다. 그래서 break 전에 따로 0을 출력으로 찍지 않고 break를 통해 나오기만 했다.

내 3시간 30분 증발 한 줄 알고 좌절했는데 그래도 끝에 풀어서 다행 ㅎㅎㅎ

3. 다른 풀이

전반적으로 코드는 비슷하다. (10진법을 2진법이나 -2진법으로 바꾸는 방법이 다 똑같으니까 ...)

if N==0:
    print(0)
    exit()

나는 무한루프를 돌다가 if문으로 특정 값을 확인하는 형태로 0에 대한 예외 처리를 했다.

그런데, 애초에 decimal이 0으로 들어왔을 때 0을 바로 찍고 코드를 종료하는 ...! exit() 코드를 알게 되었다.

출처는 아래의 블로그.
https://youjin86.tistory.com/97

역시 다른 풀이를 보는 건 정말 많은 도움이 되는 것 같다. 오늘도 신기한 알고리즘의 세계 끝!

profile
정말 알아?

0개의 댓글