OPEN HYPER STEP
← 목록으로 (math)
MATH · 13 / 15
math
CHAPTER 13 / 15
읽기 약 2
FUNCTION

카르노 맵: 논리식 최적화


핵심 개념

2~4변수 카르노 맵 — 복잡한 논리식을 시각적으로 최소항으로 축소.

본문

카르노 맵 (Karnaugh Map, K-Map)

복잡한 진리표를 격자 형태로 그려서 인접한 1을 묶어 논리식 최소화.

2변수 카르노 맵

📋 코드 (19줄)
변수: A, B
4칸 격자

      B=0   B=1
A=0 [  ?  |  ?  ]
A=1 [  ?  |  ?  ]


예: AND
      B=0   B=1
A=0 [  0  |  0  ]
A=1 [  0  |  1  ]   → AB (그대로)


예: OR
      B=0   B=1
A=0 [  0  |  1  ]   ← B만으로 묶음 (오른쪽 열)
A=1 [  1  |  1  ]   ← A만으로 묶음 (아래쪽 행)
                   → A + B

3변수 카르노 맵

📋 코드 (9줄)
변수: A, B, C
8칸 격자 (2×4)

       BC=00  BC=01  BC=11  BC=10
A=0  [   ?  |   ?  |   ?  |   ?  ]
A=1  [   ?  |   ?  |   ?  |   ?  ]


⚠️ 그레이 코드 순서: 00, 01, 11, 10 (인접 칸은 1비트 차이)

4변수 카르노 맵 — 최대 16칸

📋 코드 (5줄)
       CD=00  CD=01  CD=11  CD=10
AB=00  [  ?  |   ?  |   ?  |   ?  ]
AB=01  [  ?  |   ?  |   ?  |   ?  ]
AB=11  [  ?  |   ?  |   ?  |   ?  ]
AB=10  [  ?  |   ?  |   ?  |   ?  ]

카르노 맵으로 논리식 최소화 — 코드 예시

PYTHON📋 코드 (42줄)
import itertools

def truth_table(f, n_vars):
    """함수 f의 진리표 생성 — 4변수면 16행"""
    table = []
    for combo in itertools.product([0, 1], repeat=n_vars):
        result = f(*combo)
        table.append((combo, int(result)))
    return table


# 예: F(A, B, C) = (A∧B) ∨ (B∧C) ∨ (A∧C) (다수결)
def majority(a, b, c):
    return (a and b) or (b and c) or (a and c)


for combo, result in truth_table(majority, 3):
    print(f"A={combo[0]} B={combo[1]} C={combo[2]} | F={result}")


# 카르노 맵 시각화
def kmap_3var(f):
    print("       BC=00  BC=01  BC=11  BC=10")
    for a in [0, 1]:
        row = f"A={a}    "
        for bc in [(0,0), (0,1), (1,1), (1,0)]:
            row += f"{f(a, bc[0], bc[1])}      "
        print(row)


print("\n다수결 함수의 카르노 맵:")
kmap_3var(majority)
# 결과:
#        BC=00  BC=01  BC=11  BC=10
# A=0    0      0      1      0
# A=1    0      1      1      1

# 인접한 1들을 묶으면:
# 1) A=1 row에서 BC=01,11 → A·B
# 2) A=1 row에서 BC=11,10 → A·C
# 3) BC=11 column 전체 → B·C
# 최소화: AB + AC + BC (그대로)

자동 최소화 — Quine-McCluskey

PYTHON📋 코드 (19줄)
# 카르노 맵은 4변수까지만 시각적으로 가능
# 5변수 이상은 Quine-McCluskey 알고리즘 (자동화)

# Python: pyeda 라이브러리
# pip install pyeda

from pyeda.inter import exprvar, Or, And, Not, espresso_exprs

A, B, C, D = map(exprvar, 'ABCD')

# 복잡한 식
expr = And(A, B, Not(C)) | And(A, B, C) | And(B, C, D)
print(f"원본: {expr}")
# A·B·~C + A·B·C + B·C·D

# 최소화 (Espresso 알고리즘)
minimized, = espresso_exprs(expr.to_dnf())
print(f"최소화: {minimized}")
# A·B + B·C·D

실전 — 조건문 단순화

PYTHON📋 코드 (26줄)
# Before — 복잡한 조건
def access_decision(is_admin, is_owner, is_premium, is_blocked):
    if is_admin and not is_blocked:
        return True
    if is_owner and not is_blocked:
        return True
    if is_premium and not is_blocked and not is_owner:
        return True
    if is_admin and is_owner:
        return True
    return False


# 진리표 생성 → 카르노 맵 → 최소화
import itertools
print(f"{'admin':^6} {'owner':^6} {'prem':^6} {'block':^6} {'결과':^4}")
for combo in itertools.product([True, False], repeat=4):
    print(f"{str(combo[0]):^6} {str(combo[1]):^6} {str(combo[2]):^6} {str(combo[3]):^6} {str(access_decision(*combo)):^4}")


# After — 카르노 맵 분석으로 단순화
def access_decision_v2(is_admin, is_owner, is_premium, is_blocked):
    """is_blocked가 True면 무조건 거부 + 그 외는 admin/owner/premium 중 하나"""
    if is_blocked and not is_admin:  # admin은 block 우회
        return False
    return is_admin or is_owner or is_premium

다음 챕터

CH.14 "술어 논리" — 모든/존재 정량자 + Array.every/some의 수학적 근거.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 복잡한 if-elif-else 체인을
진리표로 변환하고 카르노 맵으로
최소화한 결과를 보여줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

하드웨어 회로 설계와 소프트웨어 조건문에서
카르노 맵 활용 비교를 실전 사례로 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 코드베이스의 5+ 조건 분기 함수
전체를 자동 분석해서 단순화 가능한
위치 Top 10을 보고해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 소프트웨어 엔지니어링에서
카르노 맵 vs Espresso 알고리즘 사용 비율과
언제 어느 것이 효과적인지 솔직히 알려줘.

⭐ 이것만 기억하세요
카르노 맵: 논리식 최적화 이 3가지만 확실히 잡으세요
1.카르노 맵은 4변수까지의 논리식을 시각적으로 최소화하는 도구 — 인접한 1들을 묶어 항을 줄임
2.5변수 이상은 Quine-McCluskey나 Espresso 알고리즘 — pyeda 같은 라이브러리로 자동화
3.다음 챕터 CH.14에서 술어 논리 — Array.every()와 Array.some()의 수학적 의미


공유하기
진행도 13 / 15