작성일 :

순열 반복 구조란?

순열 반복 구조는 유한한 상태 공간 위에서 확정적인 규칙에 따라 상태를 전이시키는 과정에서

언젠가 이전에 나타났던 상태로 다시 되돌아오는 구조를 말합니다.

이는 알고리듬 문제에서 사이클 탐지나 중복 여부 확인, 경로 최적화 등 다양한 상황에서 기본 개념으로 사용됩니다.


핵심 아이디어

  • 상태 공간이 유한하다면, 일정한 규칙에 따라 상태를 이동시킬 때 언젠가는 반드시 이전 상태로 돌아오게 됩니다.
  • 이때 상태들의 흐름은 고리(cycle)를 형성하며 반복됩니다.

이러한 구조는 수학적으로는 순열(permutation) 형태로 해석할 수 있으며,

알고리듬적으로는 사이클 탐지 또는 중복 방문 체크로 다룰 수 있습니다.

왜 ‘순열’인가?

순열은 N개의 원소를 서로 섞어 새로운 순서를 만드는 것입니다.

특히, 각 원소가 정확히 하나의 위치로 대응되고, 동시에 다른 위치로부터 정확히 하나의 원소가 대응되기 때문에

일대일 대응(bijection)의 형태를 갖습니다.

이 구조는 함수처럼 작동합니다. 예를 들어, 아래와 같은 매핑이 주어진 경우:

1
2
3
1 → 3
2 → 1
3 → 2
  • 13으로,
  • 32로,
  • 2는 다시 1로 돌아갑니다.


이 흐름을 따라가면 1 → 3 → 2 → 1이라는 폐쇄적인 순환 구조가 만들어집니다.

이처럼, 각 원소가 하나의 위치로만 이동하고, 다시 정확히 그 위치로 되돌아오는 구조는 순열의 기본적인 특성이며,

알고리듬 문제에서도 반복되는 상태 전이의 본질을 설명할 때 이 개념이 그대로 적용됩니다.

또한, 이렇게 구성된 순열은 항상 하나 이상의 순환 사이클을 포함하게 됩니다.

이 사이클은 문제의 정답을 판별하는 기준이 되거나, 최적화 대상이 되는 경우가 많습니다.


순열과 사이클 표현

임의의 순열을 다음과 같이 표현할 수 있습니다:

1
2
1 → 3 → 2 → 1
4 → 5 → 4


  • 1, 3, 2는 서로를 순서대로 가리키며 하나의 사이클을 형성합니다.
  • 45도 서로 반복되는 구조를 가집니다.

이처럼 순열은 여러 개의 불연속적인 사이클의 집합으로 분해될 수 있습니다.

이를 순열의 사이클 분해(cycle decomposition)라고 하며,

어떤 문제에서는 이 사이클의 개수나 길이가 핵심이 되기도 합니다.


순열 사이클을 이용한 문제 풀이 예시


예시: N개의 자리가 주어지고, 각 자리에 어떤 값이 매핑되어 있을 때

  • 주어진 배열을 하나의 함수처럼 생각할 수 있습니다.
  • 예: arr[i] = ji에서 j로의 상태 전이를 의미합니다.
  • 이 배열을 탐색하며 각 위치에서 방문 순서를 기록하면, 사이클이 발생하는 지점을 쉽게 찾을 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
vector<int> a(n + 1);
vector<bool> visited(n + 1, false);

for (int i = 1; i <= n; ++i) {
  if (visited[i]) continue;
  int cur = i;
  while (!visited[cur]) {
    visited[cur] = true;
    cur = a[cur];
  }
  // 사이클 하나 완료
}
  • 순열의 각 원소를 하나의 노드처럼 보고 연결 관계를 따라가며 방문하면,
    중복 없이 모든 사이클을 탐색할 수 있습니다.

그래프 구조로서의 해석

순열 반복 구조는 각 노드에서 출차수(outdegree)가 정확히 1인 방향 그래프입니다.


이러한 구조는 항상 다음과 같은 특징을 가집니다:

  • 어떤 노드에서 출발하든 반드시 사이클에 도달합니다.
  • 비순환 경로는 존재할 수 없으며, 모든 경로는 유한한 길이의 사이클로 수렴합니다.
  • 전체 그래프는 사이클 + 사이클로 향하는 경로(tail) 구조처럼 해석될 수 있습니다.


이 구조를 기반으로 다음과 같은 문제를 해결할 수 있습니다:

  • 전체 노드를 사이클 단위로 묶어 개수 세기
  • 가장 긴/짧은 사이클의 길이 측정
  • 주기성을 이용한 상태 예측 및 반복 패턴 찾기

활용 예시

  • 배열을 순열로 보는 문제: 원소들의 순서를 통해 사이클을 분석
  • 방문 경로 추적: DFS, BFS반복 상태 탐지
  • 해시 충돌 검사: 특정 해시값에 도달했는지 여부 확인
  • 암호학적 순환 분석: 작은 키 공간에서 순열 구조가 성립되는지 확인
  • 게임 상태 분석: 특정 입력에 대해 동일한 상태가 다시 등장하는지 분석

주의할 점

  • 사이클의 시작 위치사이클 길이를 구분해야 할 때는 사이클 탐지 알고리듬 들을 사용할 수도 있습니다.

참고 : 플로이드의 토끼와 거북이 알고리듬(Floyd’s Cycle Detection)의 원리와 구현 - soo:bak

  • 가능한 상태 수가 클 경우, 방문 여부 체크를 위한 자료구조의 크기와 메모리를 고려해야 합니다.
  • 반복 구조가 고정되어 있는 경우에는 미리 계산된 수열을 사용하는 방식으로 최적화할 수도 있습니다.

마무리

순열 반복 구조는 제한된 상태 공간과 결정적인 전이 함수가 주어질 때 자연스럽게 등장하는 흐름입니다.

사이클 여부를 탐지하거나, 중복 여부를 판별하는 대부분의 알고리듬 문제는 이 구조를 내포하고 있습니다.

상태 전이가 유한하고 규칙적이라면, 언제든지 반복이 발생할 수 있다는 전제를 통해 문제 해결 방향을 단순화할 수 있습니다.