도구스개발

역순쌍(inversion) 개수 계산기

수열에서 i < j인데 a[i] > a[j]인 쌍의 개수를 셉니다. 이중 반복·병합정렬·버블 정렬 세 방법으로 각각 구해 나란히 대조하고, 켄달 타우와 15퍼즐 풀림 판정에 쓰는 홀짝도 함께 냅니다.

공백·쉼표·줄바꿈으로 나눈 숫자. 1000개까지

역순쌍 개수

14쌍

가능한 최대 28쌍의 50% · 이웃끼리 바꾸기만으로 정렬하려면 최소 14번 바꿔야 합니다

이중 반복으로 직접 센 값 (O(n²))14
병합정렬로 센 값 (O(n log n))14 · 비교 17
버블 정렬의 실제 교환 횟수14 · 훑기 5
세 방법이 같은가같음
켄달 타우 상관계수 (1 − 2×정규화)0
홀짝 (15퍼즐 풀림 판정에 쓰는 값)짝수
정렬 결과1 2 3 4 5 7 8 9

병합정렬의 단계 — 조각을 두 배씩 키우며 합칠 때 세어 나갑니다

조각 길이이 단계에서 찾음누적단계가 끝난 뒤
1 (처음)05 3 8 1 9 2 7 4
2443 5 1 8 2 9 4 7
4481 3 5 8 2 4 7 9
86141 2 3 4 5 7 8 9

역순쌍 목록 (앞 14)

(1, 2) 5 > 3(1, 4) 5 > 1(1, 6) 5 > 2(1, 8) 5 > 4(2, 4) 3 > 1(2, 6) 3 > 2(3, 4) 8 > 1(3, 6) 8 > 2(3, 7) 8 > 7(3, 8) 8 > 4(5, 6) 9 > 2(5, 7) 9 > 7(5, 8) 9 > 4(7, 8) 7 > 4
계산 근거역순쌍 = |{(i, j) : i < j이고 a[i] > a[j]}| = 14최대 = n(n−1)/2 = 8×7/2 = 28켄달 타우 = 1 − 2×(14/28) = 0병합정렬로 셀 때는 두 정렬된 조각을 합치면서, 오른쪽 조각의 값을 꺼내는 순간 왼쪽 조각에 남아 있는 개수를 한꺼번에 더합니다. 그것들이 모두 방금 꺼낸 값보다 크기 때문입니다.
역순쌍의 개수는 «이웃끼리 바꾸기»로 정렬할 때의 최소 교환 횟수와 같습니다. 이웃 두 개를 한 번 바꾸면 역순쌍이 정확히 하나 줄거나 늘기 때문입니다. 그래서 버블 정렬의 실제 교환 횟수가 곧 역순쌍의 개수이고, 위 결과에서 두 값이 언제나 같습니다. 삽입 정렬이 «거의 정렬된» 입력에서 빠른 까닭도 옮겨야 할 거리의 합이 곧 역순쌍의 개수이기 때문입니다.
병합정렬을 조금 고치면 O(n log n)에 셉니다. 두 정렬된 조각을 합칠 때, 오른쪽 조각의 값을 먼저 꺼냈다면 왼쪽 조각에 남아 있는 것들은 모두 그 값보다 큽니다. 그 개수를 한꺼번에 더하면 되므로 합치는 비용에 얹혀 갑니다. 위 결과의 «비교 횟수»를 보면 전수 탐색과 얼마나 차이 나는지 알 수 있습니다.
홀짝은 15퍼즐이 풀리는지 가릅니다. 15퍼즐에서 조각을 한 번 밀 때마다 역순쌍의 홀짝과 빈칸 줄 번호의 홀짝이 함께 뒤집힙니다. 그래서 이 둘의 조합이 목표 상태와 맞지 않으면 아무리 밀어도 풀리지 않습니다. 흔히 파는 «14와 15만 바뀐» 퍼즐이 영원히 안 맞춰지는 이유가 이것입니다.
같은 값끼리는 역순쌍으로 세지 않습니다. a[i] > a[j]로 엄격히 큰 경우만 셉니다. 같은 값이 여럿이면 켄달 타우도 이 정의에 맞춰 나오므로, 동점을 따로 보정하는 타우-b와는 값이 다를 수 있습니다.

사용 방법

  1. 1수열을 공백이나 쉼표로 나눠 넣습니다.
  2. 2역순쌍 개수와, 그것이 최대치의 몇 %인지 확인합니다.
  3. 3세 가지 방법이 모두 같은 값을 내는지 대조표에서 봅니다.
  4. 4병합정렬의 단계 표에서 조각을 합칠 때마다 몇 개씩 찾아내는지 따라갑니다.

자주 묻는 질문

앞에 있는 값이 뒤에 있는 값보다 큰 쌍입니다. i < j인데 a[i] > a[j]인 (i, j)를 셉니다. 완전히 정렬된 수열은 0이고, 거꾸로 정렬된 수열은 n(n−1)/2로 최대가 됩니다. 수열이 «얼마나 뒤죽박죽인지»를 재는 가장 기본적인 값입니다.

이웃끼리 바꾸기만으로 정렬할 때의 최소 교환 횟수와 정확히 같기 때문입니다. 이웃 두 개를 한 번 바꾸면 역순쌍이 하나 줄거나 늘 뿐이므로, 0으로 만들려면 그 개수만큼 바꿔야 합니다. 그래서 버블 정렬의 실제 교환 횟수가 곧 역순쌍의 개수이고, 이 계산기는 두 값이 같은 것을 화면에서 보여 줍니다.

두 정렬된 조각을 합칠 때, 오른쪽 조각의 값을 먼저 꺼냈다면 왼쪽 조각에 남아 있는 것들은 모두 그 값보다 큽니다. 남은 개수를 한꺼번에 더하면 됩니다. 합치는 비용에 얹혀 가므로 전체가 O(n log n)이고, 이중 반복의 O(n²)보다 훨씬 빠릅니다. 원소가 512개면 비교 횟수가 13만 대 6천으로 갈립니다.

켄달 타우 상관계수는 τ = 1 − 2·(역순쌍 / 최대)로 계산합니다. 두 순위가 완전히 같으면 1, 완전히 뒤집혔으면 −1입니다. 이 계산기는 넣은 수열을 «오름차순 순위와 견준 것»으로 보고 타우를 냅니다. 다만 같은 값이 있을 때 동점을 따로 보정하는 타우-b와는 값이 다를 수 있습니다.

15퍼즐 같은 슬라이딩 퍼즐이 풀리는지 가릅니다. 조각을 한 번 밀 때마다 역순쌍의 홀짝과 빈칸 줄 번호의 홀짝이 함께 뒤집히므로, 이 둘의 조합이 목표와 맞지 않으면 아무리 밀어도 풀리지 않습니다. «14와 15만 바뀐» 퍼즐이 영원히 안 맞춰지는 이유가 이것입니다.

a[i] > a[j]로 엄격히 큰 경우만 셉니다. 같은 값끼리는 순서를 바꿔도 정렬 상태가 달라지지 않으므로 역순쌍이 아닙니다. 예를 들어 [2, 2, 2]는 0쌍, [2, 1, 2]는 1쌍입니다.

계통이 다른 세 방법으로 각각 구해 대조합니다. 이중 반복으로 직접 세기, 병합정렬을 고쳐 세기, 버블 정렬을 실제로 돌려 교환 횟수 세기입니다. 셋이 같은 실수를 저지를 길이 없으므로 값이 모두 일치하면 믿을 수 있습니다. 화면에 세 값을 나란히 냅니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 수열은 1,000개까지 받습니다. 이중 반복 대조를 함께 돌리기 때문입니다.
  • 같은 값끼리는 역순쌍으로 세지 않습니다. 동점을 보정하는 켄달 타우-b와는 값이 다를 수 있습니다.
  • 소수와 음수도 받습니다. 크기 비교만 하므로 정수일 필요가 없습니다.
  • 역순쌍 목록은 앞 30쌍까지만 보여 줍니다. 개수 자체는 전부 셉니다.
  • 병합정렬 단계는 아래에서 위로 올라가는(bottom-up) 방식입니다. 재귀로 짜도 개수는 같습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.