[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 (+가 &보다 우선순위 높음!)