비트(Bit)란 Binary Digit의 줄임 말로써, 컴퓨터가 처리하는 데이터의 최소 단위입니다. 모두가 알듯, 컴퓨터의 내부 연산에는 2진수가 사용되며, 이에따라 비트는 0과 1로써 구성됩니다. 이런 비트를 다루겠다는 말은 이진 연산을 다뤄보겠다-와 같은 의미일 것 같습니다. 이번에는 파이썬에서 제공하는 비트 연산에 대해 알아보고, 카카오 코딩 테스트 문제 하나를 예제로써 해결해보겠습니다.
1. 10진수와 2진수간의 변환
# 13이라는 10진수를 2진수로 변환
bin(13) # Output= '0b1101' / 0b는 이진수임을 의미합니다. / str으로 출력됩니다.
format(1101, 'b') # Output= '0b1101' / str으로 출력됩니다.
format(1101, '#b') # Output= '1101' / #을 사용하면 0b를 제외하고 출력됩니다.
# 1101이라는 2진수를 10진수로 변환
int('1101', base=2) # Output= 13 / int로 출력됩니다.
2. 비트 논리 연산자
: AND, OR, XOR, NOT은 &, |, ^, ~ 로써 사용됩니다.
bin(0b1101 & 0b1001) #AND 연산, Output= 0b1001
bin(0b1101 | 0b1001) #OR 연산, Output= 0b1101
bin(0b1101 ^ 0b1001) #XOR 연산, Output= 0b0100
bin(~0b1101) #NOT 연산, Output= 0b0010
3. 비트 시프트 연산자
: <<, >>는 비트를 왼쪽 또는 오른쪽으로 이동시키는 역활을 합니다.
0b1101 << 1 #SHIFT 연산, Output= 26 / 0b1101 -> 0b11010 = 26
0b1101 >> 1 #SHIFT 연산, Output= 12 / 0b1101 -> 0b110 = 6
이제 카카오 코딩 테스트 문제 를 읽어보시면, 비트 연산 중에서도 OR, |을 통해 쉽게 구현할 수 있겠다라는 생각이 듭니다. 실제 코드는 아래와 같이 완성할 수 있습니다.
def solution(n, arr1, arr2):
answer_list = []
for rowOfarr1, rowOfarr2 in zip(arr1, arr2):
rowOR = bin(rowOfarr1|rowOfarr2)[2:] #두개 행간 OR 비트 연산을 시행하고, 0b를 제외한 본체만 가져온다.
rowOR = str(rowOR) #아래 과정을 위해 str으로 변환
rowOR = rowOR.rjust(n, '0') #rowOR을 n자리수로 통일하고, 빈자리는 0로 패딩
#rowOR의 1은 #으로, 0는 공백으로 변환
#rowOR = rowOR.replace('1','#').replace('0',' ') #replace() 활용
rule = str.maketrans('10','# ') #maketrans(), translate() 활용
rowOR = rowOR.translate(rule)
answer_list.append(rowOR)
return answer_list
'머신러닝' 카테고리의 다른 글
Model-agnostic 이란? (0) | 2021.06.06 |
---|---|
정규 표현식(Regular Expressions) 및 문자열 다듬기 (0) | 2020.05.02 |
교차 검증(Cross Validation) (0) | 2020.03.30 |