관리 메뉴

솜씨좋은장씨

[BaekJoon] 24389번 : 2의 보수 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 24389번 : 2의 보수 (Python)

솜씨좋은장씨 2022. 11. 26. 11:04
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 2의 보수 입니다.

 

24389번: 2의 보수

컴퓨터는 뺄셈을 처리할 때 내부적으로 2의 보수를 사용한다. 어떤 수의 2의 보수는 해당하는 숫자의 모든 비트를 반전시킨 뒤, 1을 더해 만들 수 있다. 이때, 32비트 기준으로 처음 표현했던 수와

www.acmicpc.net

🧑🏻‍💻 문제 풀이

32비트 2진수의 2의 보수를 구한 다음

32비트 2진수와 2의 보수의 서로 다른 비트의 개수를 구하는 문제입니다.

2의 보수를 구하는 방법은 

해당하는 숫자의 모든 비트를 반전시킨 뒤, 1을 더해 만들 수 있습니다.

 

먼저 32비트 2진수를 만들어주었습니다.

2진수를 만드는데에는 bin 함수를 사용하였고

이를 32비트로 만드는 데에는 앞에 0을 채워 자리수를 맞추어주는 zfill 을 활용하였습니다.

binary = list(bin(N)[2:].zfill(32))

이 비트를 반대로 반전 시키는 데에는 각 자리의 값을 -1 한 값의 절댓값을 구하는 방식으로 반전시켰습니다.

reverse_binary = [str(abs(int(bi)-1)) for bi in binary]

마지막으로 +1을 하는 것에는 함수를 하나 만들어주었습니다.

def plus_one(bin_num):
    temp = 1
    result = []
    
    for bi_idx, bi in enumerate(bin_num[::-1]):
#         print(f"bi - {bi}")
        plus_result = int(bi) + temp
#         print(f"plus_result - {plus_result}")
        
        if plus_result > 1:
            result.append("0")
        else:
            result.append("1")
            temp = 0

        if temp == 0:
            break
            
    return bin_num[:32-bi_idx-1] + result[::-1]

 

complement = plus_one(bin_num=reverse_binary)

plus_one 함수를 이용하여 +1 을 더하여 2의 보수 계산을 완료하였습니다.

for bi, co in zip(binary, complement):
    if bi != co:
        answer += 1

마지막으로 2진수와 2의 보수의 다른 비트의 개수를 구하면 끝!

전체 코드는 아래를 참고해주세요.

🧑🏻‍💻 코드 ( Solution )

def plus_one(bin_num):
    temp = 1
    result = []
    
    for bi_idx, bi in enumerate(bin_num[::-1]):
#         print(f"bi - {bi}")
        plus_result = int(bi) + temp
#         print(f"plus_result - {plus_result}")
        
        if plus_result > 1:
            result.append(str(0))
        else:
            result.append(str(1))
            temp = 0

        if temp == 0:
            break
            
    return bin_num[:32-bi_idx-1] + result[::-1]
        
        
        


def two_complement(N):
    answer = 0
    binary = list(bin(N)[2:].zfill(32))
    
    reverse_binary = [str(abs(int(bi)-1)) for bi in binary]
    
#     print("".join(binary))
#     print("".join(reverse_binary))
    
    complement = plus_one(bin_num=reverse_binary)
#     print("".join(complement))
    
    
    for bi, co in zip(binary, complement):
        if bi != co:
            answer += 1
            
    return answer
    

if __name__ == "__main__":
    N = int(input())
    
    print(two_complement(N=N))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments