파이썬 알고리즘 인터뷰 19장을 정리한 내용입니다.
Hamming Distance
- 해밍거리는 같은 길이를 가진 두 개의 문자열에서 같은 위치에 있지만 서로 다른 문자의 개수이다
- 컴퓨터 통신에서 문자열 전송 시 에러 검출에 사용되는 방법 중 하나이다
비트 조작
부울 연산자

- 기본적인 부울 연산으로
AND,OR,NOT이 있다
#71 해밍 거리
두 정수를 입력받아 몇 비트가 다른지 계산하라
입력
1 | x = 1 |
- 해밍 거리는 두 정수 또는 두 문자열의 차이를 말하며 자연어 처리에서도 많이 사용된다
"karolin"과"kathrin"의 차이는 3이고1011101과1001001의 차이는 2다- 문자열의 경우 해밍 거리는 다른 자리의 문자 개수가 되며, 이진수의 경우 다른 위치의 비트 개수가 된다
1 | def H_distance(x: int, y: int) -> int: |
XOR연산을 이용해 풀이가 가능하다- 이진수로 변경한 후
XOR연산을 하면 다른 위치는 1이 될 것이다 - 1의 개수를 리턴하면 된다
#72 두 정수의 합
두 정수 a와 b의 합을 구하라. ‘+’와 ‘-‘연산자는 사용할 수 없다
입력
1 | a = 1 |
전가산기 구현
:——–:|:———-:
| 
- 왼쪽 그림은 전가산기의 회로도의 진리표이다
Q1,Q2,Q3에 회로도의 중간값을 계산한다
1 | def sumOfTwoNum(a: int, b: int) -> int: |
논리 회로도에 따라 전가산기를 구현해 준다
정수를 이진수로 변경하기 위한 전처리가 필요하다
bin()함수를 이용해 정수를 이진수로 바꿔준다- 이진수로 변환하면
0b식별자가 붙기 때문에 슬라이싱으로 분리해준다 a & MASK에서MASK는 비트 마스크로, 음수 처리를 위해 2의 보수로 만들어주는 역할을 한다. 여기서는 입력값을 32비트 정수로 가정했으므로MASK는0xFFFFFFFF로 하였으며, 이 값과AND연산을 하면 2의 보수 값을 얻을 수 있다
1
2
3
4
5bin(1 & MASK)
'0b1'
>>>bin(-1 & MASK)
'Øb11111111111111111111111111111111'- 양수는 마스킹해도 동일하지만 계산하기 쉽게 하기위해 앞의 자리수를
zfill(32)를 사용하여 0을 채워준다
낮은 자릿수부터 하나씩 전가산기를 통과하면서 결과를 채워나간다
32비트로 가정하였기 때문에 32번 반복한다
마지막 반복이 끝난 후
carry값이 남아있으면 자릿수가 하나 올라간 것이기 때문에 1을 추가해준다만약 1을 추가해줘 33비트가 되어도 마스킹 작업을 해줘 32비트를 맞춰줄 수 있다
result는 낮은 자릿수부터 채웠기 때문에, 뒤집어 준 후 십진수로 바꿔준다양의 정수 최댓값은
0x7FFFFFFF이므로, 만약 32번째 비트가 1이면 이 값보다 큰 값이 되며 다시 마스킹 값과XOR한 후NOT연산을 해서 음수로 만들어 준다
간소한 구현
1 | def simple(a: int, b: int) -> int: |
- 앞서 풀이한 코드에서 2의 보수를 만들기 위한
MASK를 사용하였다 a는carry값을 고려하지 않는a와b의 합이 담기게 하고b는 자릿수를 올려가면서carry값이 담기게 한다- 마지막에는 음수처리를 해준다
- 전가산기를 구현한 코드보다 간소하지만 실행시간은 차이가 나지 않는다
#73 UTF-8 검증
입력값이 UTF-8 형식 문자열이 맞는지 검증하라
입력
1 | data = [197, 130, 1] |
1 | def UTP(data: list) -> bool: |

- 표는 UTF-8 바이트 순서의 이진 포맷이다
- 첫 바이트가
1110으로 시작한다면 3바이트 문자이며 첫 바이트를 제외하고 다음에 오는 2바이트는 모두10으로 시작해야 한다 first첫 바이트를 가리키며 첫 바이트가0으로 시작한다면 1바이트 문자이고110으로 시작하면 2바이트 문자가 된다check함수는 파라미터로size를 받아 해당 사이즈만큼 바이트가10으로 시작하는지 판별한다- 조건에 맞지 않으면
FALSE를 리턴한다