장장 3시간 30분을 푼 문제...
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에서 무한 루프를 돌게 된 것이다.
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분 증발 한 줄 알고 좌절했는데 그래도 끝에 풀어서 다행 ㅎㅎㅎ
전반적으로 코드는 비슷하다. (10진법을 2진법이나 -2진법으로 바꾸는 방법이 다 똑같으니까 ...)
if N==0:
print(0)
exit()
나는 무한루프를 돌다가 if문으로 특정 값을 확인하는 형태로 0에 대한 예외 처리를 했다.
그런데, 애초에 decimal이 0으로 들어왔을 때 0을 바로 찍고 코드를 종료하는 ...! exit() 코드를 알게 되었다.
출처는 아래의 블로그.
https://youjin86.tistory.com/97
역시 다른 풀이를 보는 건 정말 많은 도움이 되는 것 같다. 오늘도 신기한 알고리즘의 세계 끝!