2. 연산자 — 더 나아가기

여기서부터는 비트 연산과 수학 연산을 조금 더 깊이 다뤄봅니다. 처음엔 낯설어도, 코테에서 심심찮게 등장하니 눈에 익혀두면 좋아요.

비트 연산자 — 숫자를 2진수로 다룬다

컴퓨터는 숫자를 2진수(0과 1)로 저장합니다. 비트 연산자는 그 2진수의 각 자리를 직접 다루는 도구예요.

print(5 & 3)          # 출력: 1     (AND: 둘 다 1인 자리만 1 → 101 & 011 = 001)
print(5 | 3)          # 출력: 7     (OR: 하나라도 1이면 1 → 101 | 011 = 111)
print(5 ^ 3)          # 출력: 6     (XOR: 서로 다르면 1 → 101 ^ 011 = 110)
print(~5)             # 출력: -6    (NOT: 비트를 뒤집기, ~x 는 -(x+1) 이 돼요)
print(1 << 4)         # 출력: 16    (왼쪽 시프트: 1을 4칸 밀기 = 2의 4승)
print(16 >> 2)        # 출력: 4     (오른쪽 시프트: 16을 2칸 밀기 = 16 // 4)
  • XOR(^) 는 "짝 찾기"에 강력해요. 같은 값을 두 번 XOR 하면 사라지므로, 배열에서 혼자 남은 원소를 찾을 때 씁니다.
  • 왼쪽 시프트(<<)1 << n 으로 "2의 n승"을 빠르게 만들 때 자주 쓰여요.

💡 비트 연산은 "부분집합 만들기(비트마스킹)", "짝 찾기", "2의 거듭제곱 계산"에서 등장합니다. 아직 어렵다면 이런 게 있다는 것만 기억해두세요.

최대공약수 · 최소공배수 — math.gcd, math.lcm

직접 구현할 필요 없이 표준 라이브러리가 해결해 줍니다. import math 를 먼저 해줘야 해요.

import math

print(math.gcd(12, 18))   # 출력: 6    (최대공약수: 12와 18을 나누는 가장 큰 수)
print(math.lcm(4, 6))     # 출력: 12   (최소공배수: 4와 6의 공통 배수 중 가장 작은 수)

💡 분수 계산, 주기가 맞아떨어지는 시점 찾기 같은 문제에서 최대공약수/최소공배수가 자주 필요합니다.

나눗셈 심화 — 음수일 때 조심하세요

파이썬의 //% 는 음수에서 다른 언어와 다르게 동작합니다. 초보자가 가장 많이 헷갈리는 부분이에요.

print(-7 // 2)        # 출력: -4   (몫을 '작은 쪽으로 내림' → -3.5 를 내리면 -4)
print(-7 % 3)         # 출력: 2    (나머지는 항상 0 이상! 음수가 안 나와요)

-7 // 2 는 -3.5 를 무조건 아래(작은 쪽)로 내려서 -4 가 되고, -7 % 3 은 나머지가 항상 양수라 2 가 됩니다.

💡 좌표를 격자로 나누거나 순환 인덱스를 계산할 때 음수 나눗셈이 튀어나옵니다. 파이썬 나머지는 항상 양수라는 점을 알아두면 버그를 크게 줄일 수 있어요.

복합 대입 연산자 — 짧게 쓰기

기존 값을 바꿔서 다시 넣을 때, 변수 이름을 두 번 쓰지 않고 짧게 표현할 수 있어요.

x = 5
x += 1                # x = x + 1 과 같음 → 6
print(x)              # 출력: 6

x *= 2                # x = x * 2 와 같음 → 12
print(x)              # 출력: 12

x //= 3               # x = x // 3 과 같음 → 4
print(x)              # 출력: 4

💡 반복문 안에서 누적 합을 구하거나 카운트를 셀 때 total += num, count += 1 형태로 끊임없이 씁니다. 코드가 훨씬 깔끔해져요.