본문으로 건너뛰기
김신건의 로그

불변량 (Invariant)

· 수정 · 📖 약 2분 · 738자/단어 #algorithm #foundation #invariant
invariant, 불변량, 불변량 찾기, invariant method

정의

불변량 (Invariant) 은 어떤 변환(operation)이 적용되어도 변하지 않는 양이나 성질. 불가능성 증명, 알고리즘의 정당성(correctness) 증명, 종료 조건 분석에 사용. 대표적으로 parity, coloring, sum/mod, algebraic invariant 가 있다.

문제 상황과 동기

“이 상태에서 저 상태로 도달할 수 있는가?” 를 판별할 때, 가능한 모든 연산을 시뮬레이션할 수는 없다.

  • naive: BFS/DFS로 모든 상태 탐색. 상태 공간이 지수적으로 커짐.
  • invariant: 항상 보존되는 양 Q를 찾아, Q(initial) != Q(target) 임을 보이면 불가능 증명. O(1) 판별.

핵심 통찰: 변환은 특정 양을 보존한다. 보존되는 양이 다르면 절대 도달할 수 없다.

시각화

핵심 아이디어

초기 상태 S0 = (변수, 구조, ...)
불변량 I(S) 가 모든 가능한 변환 T 에 대해 I(S) = I(T(S)) 를 만족
I(S0) != I(목표) => 목표 도달 불가능

대표적인 불변량:

불변량적용예시
Parity (홀짝)inversion count, bit flip, swap15-puzzle, permutation sortability
Coloringcheckerboard 2-coloringdomino tiling, chessboard covering
Sum/Mod합 또는 mod M 보존물병 문제, number theory
Algebraicinvariant polynomialgraph isomorphism, knot theory

알고리즘

invariant_check(sequence, operation):
    I = compute_invariant(sequence)
    # operation 이 I 를 보존하는지 확인
    for each possible operation:
        assert I == compute_invariant(apply(sequence, operation))
    # 목표 상태의 I 와 비교
    return I == compute_invariant(target)

구현

// 순열의 inversion parity 계산
// 불변량: 인접 swap 은 inversion parity 를 바꾸지 않는다
#include <bits/stdc++.h>
using namespace std;
int main() {
  int n; cin >> n;
  vector<int> a(n);
  for (auto& v : a) cin >> v;
  int inv = 0;
  for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++)
          if (a[i] > a[j]) inv++;
  cout << (inv % 2 == 0 ? "even" : "odd") << "\n";
  // 15-puzzle: inversions % 2 == 0 이면 solvable (empty row 보정)
  return 0;
}
stdin
4
3 1 4 2
결과
even

복잡도

항목
불변량 계산O(N) 또는 O(N log N)
판별O(1) (initial vs target 비교)
invariant 찾기문제마다 다름 (경험 + 통찰)
안정성항상 정확 (necessary & sufficient)

변형 / 활용

변형설명활용
Parity invariantinversion count, XOR parity15-puzzle, Sorting network
Coloring invariant그래프 2-coloring, bipartiteness체스판 tiling, domino covering
Monovariant단조 변화량 (항상 증가/감소)종료 증명, potential function
Algebraic invariant차수, rank, determinant선형대수, 매트로이드

함정

1. 불변량이 충분 조건이 아닐 때

같은 불변량 값을 가져도 실제로 도달 가능하지 않을 수 있음. parity 만으로 15-puzzle 이 완전히 결정되지는 않음 (empty tile row 도 고려).

2. invariant vs monovariant 혼동

불변량은 변하지 않는 양. Monovariant는 단조 변하는 양 (항상 증가/감소). 후자는 알고리즘 종료 증명에 사용.

3. 불변량을 잘못 선택

너무 강한 불변량은 깨지기 쉽고, 너무 약한 불변량은 useless. 경험적으로 mod 2, sum, XOR 이 자주 통함.

BOJ 연습 문제

번호제목정답률링크
BOJ 2136개미33.7%kokoa-lab
BOJ 7538Incomplete chess boards69.7%kokoa-lab
BOJ 10424알고리즘 기말고사31.8%kokoa-lab
BOJ 32034동전 쌍 뒤집기35.0%kokoa-lab

참고

이 글의 용어 (4개)
게임 이론 (Game Theory)algorithm
정의 게임 이론 (Game Theory) 은 둘 이상의 플레이어가 정해진 규칙 아래 의사 결정을 내리는 상황을 수학적으로 모델링하는 분야. PS에서는 두 명이 완벽한 플레이를 할…
그래프 순회 (Graph Traversal)algorithm
정의 그래프 순회 (Graph Traversal) 는 그래프 G=(V, E) 의 모든 정점 V 를 체계적으로 방문하는 알고리즘 패밀리. 대표 구현: 너비 우선 탐색 (BFS), …
순열 사이클 분해 (Permutation Cycle Decomposition)algorithm
정의 순열 사이클 분해는 순열 p[1..N]을 서로소(disjoint)인 사이클들의 곱으로 표현하는 것. 각 사이클 (a1 a2 ... ak) 는 a1 -> p[a1] = a2,…
홀짝성 (Parity)algorithm
정의 홀짝성 (Parity) 은 어떤 양이 짝수 / 홀수 라는 두 상태로 분류되는 불변량. 수학적으로는 의 값. PS 에서는 증명 (impossibility), 2색 분할, 대칭…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기