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형태로 끊임없이 씁니다. 코드가 훨씬 깔끔해져요.