반응형
2진수 다국어
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
2 초 | 128 MB | 9798 | 4571 | 3748 | 45.663% |
문제
- 2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 2, 2, 2, 2이 표현 되지만 -2진법에서는 (-2)⁰ = 1, (-2)¹ = -2, (-2)² = 4, (-2)³ = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다. 10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 10진법으로 표현된 수 N이 주어진다.
출력
- 2진법 수를 출력한다.
제한
- 2,000,000,000 ≤ N ≤ 2,000,000,000
예제 입력 1
-13
예제 출력 1
110111
풀이
1)
n=int(input())
tmp=""
while(n!=0):
if(n%(-2)!=0):
n=n//(-2)+1
tmp+='1'
else:
n=n//(-2)
tmp+='0'
if(tmp==""):
tmp+='0'
print(tmp[::-1])
- 풀이과정
2진수 - 첫째자리부터 1, 2, 4, 8, …
-2진수 - 첫째자리부터 1,-2, 4,-8,…
2진수를 구할 때처럼 -2로 나눠주면 되는데 음수로 나누면 몫이 하나가 더 더해져야 한다.
ex) -13 % 2 = 6이지만 7이 필요하다. 그렇게 해야 나머지가 양수로 나온다.
나머지가 양수여야 진수를 만들기에 7이 되도록 1을 추가했다. 이런 식으로 나누어 떨어지지 않을 경우에는 양수로 계산한 몫보다 1을 더해준다.
2)
def to_negative_base_2(n):
if n == 0:
return "0"
result = []
while n:
n, remainder = divmod(n, -2)
if remainder < 0:
remainder += 2
n += 1
result.append(str(remainder))
return "".join(result[::-1])
n = int(input())
print(to_negative_base_2(n))
- 풀이과정
def to_negative_base_2(n):
: -2진법으로 변환하는 함수to_negative_base_2
를 정의합니다. 입력 인자로 10진수 숫자n
을 받습니다.
if n == 0:
: 입력된 숫자n
이 0인 경우를 확인합니다.
return "0"
:n
이 0이면 -2진법으로 변환할 필요 없이 "0"을 반환합니다.
result = []
: -2진법의 자릿수를 저장할 빈 리스트result
를 생성합니다.
while n:
:n
이 0이 아닐 동안 반복문을 실행합니다.
n, remainder = divmod(n, -2)
:n
을 -2로 나눈 몫과 나머지를 동시에 계산하고, 각각n
과remainder
에 할당합니다.
if remainder < 0:
: 나머지remainder
가 음수인 경우를 확인합니다.
remainder += 2
: 음수인 나머지에 2를 더해 양수로 만듭니다.
n += 1
:n
에 1을 더해 다음 반복에서 올바른 몫을 얻을 수 있도록 조정합니다.
result.append(str(remainder))
: 계산된 나머지를 문자열 형태로result
리스트에 추가합니다.
return "".join(result[::-1])
:result
리스트의 요소들을 역순으로 연결한 문자열을 반환합니다.
코드 실행:
n = int(input())
: 사용자로부터 10진수 숫자를 입력받아 정수로 변환한 후,n
에 할당합니다.
print(to_negative_base_2(n))
:to_negative_base_2
함수를 사용하여n
을 -2진법으로 변환하고 결과를 출력합니다.
3)
def go(n):
if n == 0:
return
if n % 2 == 0:
go(-(n//2))
print(0,end='')
else:
if n > 0:
go(-(n//2))
else:
go((-n+1)//2)
print(1,end='')
n = int(input())
if n == 0:
print(0)
else:
go(n)
- 풀이과정
def go(n):
: -2진법 변환을 위한 재귀 함수go
를 정의합니다. 입력 인자로 10진수 숫자n
을 받습니다.
if n == 0:
: 입력된 숫자n
이 0인 경우를 확인합니다.
return
:n
이 0이면 -2진법 변환을 종료합니다.
if n % 2 == 0:
: 입력된 숫자n
이 짝수인 경우를 확인합니다.
go(-(n//2))
:n
을 -2로 나눈 몫을 다음 재귀 호출에 전달합니다.
print(0, end='')
: 짝수인 경우, -2진법 자릿수에 0을 출력합니다.
else:
: 입력된 숫자n
이 홀수인 경우를 처리합니다.
if n > 0:
:n
이 양수인 경우를 확인합니다.
go(-(n//2))
:n
을 -2로 나눈 몫을 다음 재귀 호출에 전달합니다.
else:
:n
이 음수인 경우를 처리합니다.
go((-n+1)//2)
:n+1
을 2로 나눈 몫을 다음 재귀 호출에 전달합니다.
print(1, end='')
: 홀수인 경우, -2진법 자릿수에 1을 출력합니다.
- 코드 실행
n = int(input())
: 10진수 숫자를 입력받아 정수로 변환한 후,n
에 할당합니다.
if n == 0:
: 입력된 숫자n
이 0인 경우를 확인합니다.
print(0)
:n
이 0이면 -2진법으로 변환할 필요 없이 0을 출력합니다.
else:
: 입력된 숫자n
이 0이 아닌 경우를 처리합니다.
go(n)
: 재귀 함수go
를 호출하여n
을 -2진법으로 변환하고 결과를 출력합니다.
Uploaded by N2T
반응형
'Algorithm' 카테고리의 다른 글
[백준 1463 파이썬/python] 1로 만들기 (0) | 2023.04.12 |
---|---|
슬라이싱 (0) | 2023.04.12 |
[백준 1212 파이썬/python] 8진수 2진수 (0) | 2023.04.12 |
[백준 17103 파이썬/python] 골드바흐 파티션 (0) | 2023.04.12 |
[백준 2089 파이썬/python] -2진수 (0) | 2023.04.12 |