최재영의 개발 일지
GitHubLinkedIn

[PS] 연산자

Python1분 읽기

1. 산술 연산자

# +, -, *, /, //, %, **

10 // 3    # 3
-10 // 3   # -4
10 % 3     # 1
-10 % 3    # 2
2 ** 10    # 1024

자주 쓰는 패턴

# 1) 중간값 (파이썬은 bigint라 오버플로우 걱정 없음)
mid = (left + right) // 2

# 2) 올림 나눗셈 (math.ceil 대신)
import math
math.ceil(10 / 3)   # 4
(10 + 3 - 1) // 3   # 4 (더 빠름)

# 3) 짝홀 판단
n % 2 == 0  # 짝수
n % 2 != 0  # 홀수 (n & 1 이 더 빠름)

# 4) 자릿수 분리
n = 1234
digits = []
while n:
    digits.append(n % 10)
    n //= 10
# digits = [4, 3, 2, 1]

2. 비교 연산자

# ==, !=, <, >, <=, >=

1 < x < 10
0 <= idx < len(arr)

# 리스트/딕셔너리 비교 (깊은 비교 자동 지원)
[1, 2, 3] == [1, 2, 3]
{ 'a': 1 } == { 'a': 1 }

주의: is는 객체를 비교한다.

3. 논리 연산자

# and, or, not

# and: 첫 번째 falsy값 반환, 없으면 마지막 값 반환
0 and 5     # 0
3 and 5     # 5
[] and [1]  # []

# or: 첫 번째 truthy값 반환, 없으면 마지막 값 반환
0 or 5     # 5
3 or 5     # 3
[] or [1]  # [1]

자주 쓰는 패턴

# 1) 기본값 설정
val = user_input or "default"

# 2) 조건부 실행 (코드 단축)
arr and arr[0]  # arr이 비어있으면 [], 있으면 첫 원소

# 3) 딕셔너리에서 안전한 접근
graph = {}
graph.get(node, []) or []

주의: 0, "", [], {}, None은 모두 falsy이다.

4. 비트 연산자

# & (AND)
# | (OR)
# ^ (XOR)
# ~ (NOT)
# << (L-SHIFT)
# >> (R-SHIFT)

자주 쓰는 패턴

# 1) 짝홀 판단 (% 보다 빠름)
n & 1 == 0  # 짝수
n & 1 == 1  # 홀수

# 2) 2의 거듭제곱 판단
n & (n - 1) == 0  # True면 2의 거듭제곱 (n > 0 조건 추가)
# 원리: 2^k = 100...0, 2^k - 1 = 011...1 → AND = 0

# 3) 2배, 절반 (시프트)
n << 1  # n * 2
n >> 1  # n // 2

# 4) XOR - 쌍 소거 (짝수 개 중 혼자인 원소 찾기)
nums = [1, 2, 3, 2, 1]
result = 0
for n in nums:
    result ^= n
# result = 3  ← 쌍이 없는 원소

# 5) 비트마스킹 - 부분집합 표현 (N <= 20 조건에서 등장)
n = 4  # 4개 원소
for mask in range(1 << n):  # 0 ~ 2^n - 1
    subset = [i for i in range(n) if mask & (1 << i)]
    print(subset)

# 6) 특정 비트 켜기/끄기/토글
bit = 2  # 2번 비트 (0-indexed)
state |= (1 << bit)   # 켜기
state &= ~(1 << bit)  # 끄기
state ^= (1 << bit)   # 토글
state & (1 << bit)    # 확인

주의: ~n = -(n+1) (파이썬은 2의 보수) ~5 = -6, ~0 = -1이다. 활용: 배열의 역인덱스와 같다.

5. 할당 연산자

# +=, -=, *=, //=, **=, %=, &=, |=, ^=, >>=, <<=

자주 쓰는 패턴

# 1) 누적 합
total = 0
for n in nums:
    total += n

# 2) 연속 할당 (swap - 파이썬 특기)
a, b = b, a  # 임시변수 불필요!

# 3) 증감 주의 (파이썬엔 ++, -- 없음)
i++     # SyntaxError
i += 1  # 올바른 방법

주의

# 잘못된 패턴 - 모든 인스턴스가 같은 리스트 공유
def append_val(val, lst=[]):
    lst.append(val)
    return lst
append_val(1)  # [1]
append_val(2)  # [1, 2] ← 초기화 안 됨!

# 올바른 패턴
def append_val(val, lst=None):
    if lst is None: lst = []
    lst.append(val)
    return lst

6. 멤버십/식별 연산자

# in, not in, is, is not

자주 쓰는 패턴

# 자주 쓰는 패턴
visited = set()
if node not in visited:
    visited.add(node)

# 문자열에서도 사용 가능
"hello" in "hello world"  # True

# is None 체크 (== None 보다 is 권장)
if val is None:
    ...
if val is not None:
    ...

주의

# in 연산자 시간복잡도 주의!
x in list    # O(n) ← 느림
x in set     # O(1) ← 빠름
x in dict    # O(1) ← key 검색

7. 삼항 연산자 (조건 표현식)

a if condition else b

자주 쓰는 패턴

result = a if a > b else b     # max(a, b)
abs_val = n if n >= 0 else -n  # abs(n)

# 리스트 컴프리헨션과 조합
filtered = [x if x > 0 else 0 for x in nums]  # 음수를 0으로

# 중첩 삼항 (가독성 주의)
grade = "A" if score >= 90 else "B" if score >= 80 else "C"

연산자 우선순위

(가장 높음)
**
~, +(단항), -(단항)
*, /, //, %
+, -
<<, >>
&
^
|
==, !=, <, >, <=, >=, is, is not, in, not in
not
and
or
(가장 낮음)

주의: 우선순위 함정

2 ** 3 ** 2    # 512 (오른쪽부터: 3**2=9, 2**9=512)
(2 ** 3) ** 2  # 64

not 1 == 1     # False (1==1 먼저 → not True → False)
(not 1) == 1   # False (not 1 = False, False==1 → False)

3 & 5 + 1      # 3 & 6 = 2 (+가 &보다 우선순위 높음!)