나를 기록하다
article thumbnail
반응형

2진수 다국어

시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초128 MB97984571374845.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))
  • 풀이과정
    1. def to_negative_base_2(n):: -2진법으로 변환하는 함수 to_negative_base_2를 정의합니다. 입력 인자로 10진수 숫자 n을 받습니다.
    1. if n == 0:: 입력된 숫자 n이 0인 경우를 확인합니다.
    1. return "0": n이 0이면 -2진법으로 변환할 필요 없이 "0"을 반환합니다.
    1. result = []: -2진법의 자릿수를 저장할 빈 리스트 result를 생성합니다.
    1. while n:: n이 0이 아닐 동안 반복문을 실행합니다.
    1. n, remainder = divmod(n, -2): n을 -2로 나눈 몫과 나머지를 동시에 계산하고, 각각 nremainder에 할당합니다.
    1. if remainder < 0:: 나머지 remainder가 음수인 경우를 확인합니다.
    1. remainder += 2: 음수인 나머지에 2를 더해 양수로 만듭니다.
    1. n += 1: n에 1을 더해 다음 반복에서 올바른 몫을 얻을 수 있도록 조정합니다.
    1. result.append(str(remainder)): 계산된 나머지를 문자열 형태로 result 리스트에 추가합니다.
    1. return "".join(result[::-1]): result 리스트의 요소들을 역순으로 연결한 문자열을 반환합니다.

    코드 실행:

    1. n = int(input()): 사용자로부터 10진수 숫자를 입력받아 정수로 변환한 후, n에 할당합니다.
    1. 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)
  • 풀이과정
    1. def go(n):: -2진법 변환을 위한 재귀 함수 go를 정의합니다. 입력 인자로 10진수 숫자 n을 받습니다.
    1. if n == 0:: 입력된 숫자 n이 0인 경우를 확인합니다.
    1. return: n이 0이면 -2진법 변환을 종료합니다.
    1. if n % 2 == 0:: 입력된 숫자 n이 짝수인 경우를 확인합니다.
    1. go(-(n//2)): n을 -2로 나눈 몫을 다음 재귀 호출에 전달합니다.
    1. print(0, end=''): 짝수인 경우, -2진법 자릿수에 0을 출력합니다.
    1. else:: 입력된 숫자 n이 홀수인 경우를 처리합니다.
    1. if n > 0:: n이 양수인 경우를 확인합니다.
    1. go(-(n//2)): n을 -2로 나눈 몫을 다음 재귀 호출에 전달합니다.
    1. else:: n이 음수인 경우를 처리합니다.
    1. go((-n+1)//2): n+1을 2로 나눈 몫을 다음 재귀 호출에 전달합니다.
    1. print(1, end=''): 홀수인 경우, -2진법 자릿수에 1을 출력합니다.
    • 코드 실행
    1. n = int(input()): 10진수 숫자를 입력받아 정수로 변환한 후, n에 할당합니다.
    1. if n == 0:: 입력된 숫자 n이 0인 경우를 확인합니다.
    1. print(0): n이 0이면 -2진법으로 변환할 필요 없이 0을 출력합니다.
    1. else:: 입력된 숫자 n이 0이 아닌 경우를 처리합니다.
    1. go(n): 재귀 함수 go를 호출하여 n을 -2진법으로 변환하고 결과를 출력합니다.


Uploaded by N2T

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...