나열하는 방법의 종류를 고르고, 나열할 것의 개수 n을 입력하세요. 원형으로 나열하는 경우의 수를 풀이 과정과 그림으로 계산합니다.
이 페이지에서 할 수 있는 것
- 원탁에 \(n\)명이 앉는 방법의 수(원순열) \((n-1)!\)을 사람 수만 넣으면 계산할 수 있습니다
- \(n\)개에서 \(r\)개만 뽑아 원형으로 나열하는 경우의 수 \(\dfrac{{}_{n}\mathrm{P}_{r}}{r}\)도 계산할 수 있습니다
- 목걸이처럼 ‘뒤집어서 겹치는 것은 같은 것’으로 세는 염주순열 \(\dfrac{(n-1)!}{2}\)도 계산할 수 있습니다(그대로 나누면 틀리는 \(n = 1,\ 2\)인 경우도 올바르게 처리합니다)
- ‘특정한 2명이 이웃하는’, ‘이웃하지 않는’ 경우의 수도 2명을 한 묶음으로 보는 풀이 과정과 함께 계산할 수 있습니다
- 답은 반올림하지 않고 모든 자리를 표시합니다. 자릿수가 많을 때는 \(1.23\times10^{35}\) 같은 어림값도 함께 보여 주므로 크기를 한눈에 알 수 있습니다
- ‘왜 \(n!\)을 \(n\)으로 나누는지’를 회전 그림으로 확인할 수 있습니다. Excel·Google 스프레드시트·Python에 복사해 쓸 수 있는 수식도 이 페이지에 모아 두었습니다
이 계산은 어디에 쓰일까요?
원탁에서는 탁자째 돌려도 ‘누구 옆에 누가 앉는지’는 바뀌지 않습니다. 그래서 자리 배치의 수는 한 줄로 나열할 때의 \(n!\)이 아니라 원순열 \((n-1)!\)이 되어, 6명이면 120가지, 8명이면 5,040가지입니다.
‘이 2명은 옆자리로(또는 떨어뜨려서)’ 같은 요청이 있으면 경우의 수가 크게 달라집니다. 6명에서 특정한 2명을 옆에 앉히는 방법은 48가지, 옆에 앉히지 않는 방법은 72가지입니다. 행사 담당자가 고를 수 있는 자리 배치가 몇 가지인지 어림이 아니라 정확하게 알 수 있습니다.
영업소도 들르는 곳 하나로 세어, 모두 \(n\)곳을 한 번씩 지나 한 바퀴 도는 경로를 생각해 보겠습니다. 같은 경로는 어디서 출발하든 같은 고리이고(회전), 각 도로의 거리가 가는 방향과 오는 방향이 같다면 반대로 돌아도 거리가 같습니다(뒤집기). 그래서 서로 다른 경로의 수는 염주순열과 같은 \(\dfrac{(n-1)!}{2}\)가지입니다.
영업소를 포함해 10곳이면 181,440가지, 15곳이면 약 \(4.36\times10^{10}\)가지입니다. 모두 시도해서 가장 짧은 경로를 찾는 것은 현실적이지 않으므로, 배송 경로를 짜는 소프트웨어는 여러 가지 지름길(최적화 기법)을 씁니다. 이 경우의 수가 ‘모든 경로를 확인하면 된다’가 통하지 않는 이유입니다.
색이나 모양이 다른 구슬 \(n\)개를 한 바퀴로 잇는 디자인의 수는 염주순열의 \(\dfrac{(n-1)!}{2}\)가지입니다. 고리는 돌려도 뒤집어도 같은 작품이므로, 원순열을 다시 \(2\)로 나눕니다. 구슬이 5개이면 12가지, 6개이면 60가지입니다.
다만 한쪽 면에만 무늬가 있는 구슬처럼 앞뒤가 구별되어 뒤집어서 착용할 수 없는 작품이라면, 뒤집은 것을 같은 것으로 볼 수 없습니다. 이때는 \(2\)로 나누지 않고 원순열 \((n-1)!\)로 셉니다(6개이면 120가지). 뒤집을 수 있는지 하나만으로 디자인의 수가 2배 차이 납니다.
많은 게임에서는 차례가 자리를 따라 한 방향으로 돕니다. ‘누구 다음에 누가 하는지’라는 순서는 자리 전체를 돌려도 바뀌지 않으므로 원순열 \((n-1)!\)이 되어, 4명이면 6가지, 5명이면 24가지입니다.
먼저 하는 사람이 유리한 게임에서는 누가 시작하는지도 구별하고 싶을 때가 있습니다. 그때는 차례의 순서 \((n-1)!\)가지에 첫 번째 사람을 고르는 \(n\)가지를 곱해 \(n!\)가지(4명이면 24가지)가 됩니다. ‘자리 순서만’과 ‘시작하는 사람까지 포함’을 나누어 생각하면 공평한 정하는 방법을 생각하기 쉬워집니다.
‘이 순서대로 돌리고, 끝까지 가면 처음으로 돌아간다’는 당번표는 누구부터 시작하든 같은 순환이므로 원순열로 셉니다. 5명의 당번표라면 \((5-1)! = 24\)가지입니다.
여기에 ‘이 2명은 연달아(이웃해서) 맡지 않게 한다’는 조건을 더하면, 전체에서 이웃하는 경우를 빼서 \((n-1)! - 2 \times (n-2)!\)로 구합니다. 5명이면 24 − 12 = 12가지로 줄어듭니다. 조건 하나를 더하면 선택지가 절반이 된다는 것을 공식으로 분명하게 알 수 있습니다.
공식과 그림
용어·기호 해설
기호
| \(n\) | 엔 | 나열할 것의 전체 개수입니다. number(수)의 첫 글자로, 개수를 나타내는 문자로 널리 쓰입니다. 이 페이지에서는 원탁에 앉는 사람 수나 고리로 잇는 구슬의 개수에 해당합니다. |
| \(r\) | 알 | 전체 \(n\)개 중에서 뽑아 실제로 나열하는 개수입니다. \({}_{n}\mathrm{P}_{r}\)처럼 \(n\)과 함께 쓰이며 ‘\(n\)개에서 \(r\)개’라고 읽습니다. |
| \(n!\) | n 팩토리얼 | 계승입니다. \(n! = n \times (n-1) \times \cdots \times 2 \times 1\)로, \(n\)개 모두를 한 줄로 나열하는 방법의 수입니다. 느낌표 기호는 1808년에 프랑스의 수학자 크람프(Christian Kramp)가 쓰기 시작했다고 알려져 있습니다. 또한 \(0! = 1\)로 정해져 있습니다. |
| \({}_{n}\mathrm{P}_{r}\) | n P r | 순열입니다. \(n\)개에서 \(r\)개를 뽑아 한 줄로 나열하는 방법의 수로, \({}_{n}\mathrm{P}_{r} = n \times (n-1) \times \cdots \times (n-r+1)\)로 계산합니다. \(\mathrm{P}\)는 permutation(순열)의 첫 글자입니다. |
| \(N\) | 대문자 엔 | 이 페이지에서 원순열의 수를 나타내는 문자입니다. number(수)의 첫 글자를 대문자로 쓴 것으로, 구하려는 개수를 나타내는 문자로 자주 쓰입니다. |
| \(M\) | 엠 | 이 페이지에서 염주순열의 수를 나타내는 문자입니다. 알파벳에서 \(N\) 바로 앞의 문자로, \(N\)과는 다른 또 하나의 개수를 나타내고 싶을 때 씁니다. |
| \(A,\ B\) | 에이, 비 | 이 페이지에서는 특정한 2개가 이웃하는 경우의 수를 \(A\), 이웃하지 않는 경우의 수를 \(B\)로 나타냅니다. 알파벳 앞쪽의 문자는 구하려는 정해진 수를 나타낼 때 관례적으로 씁니다. |
| \((n-1)!\) | n 빼기 1 팩토리얼 | 원순열의 수를 나타내는 식입니다. \(n\)개를 원형으로 나열할 때 돌려서 겹치는 \(n\)가지의 겹침을 없앤 결과입니다. ‘하나를 고정하고 나머지 \(n-1\)개를 나열한다’고 생각해도 같은 식이 됩니다. |
용어
| 경우의 수 | 어떤 조건을 만족하는 방법이 모두 몇 가지인지를 나타내는 수입니다. ‘몇 가지인가?’라고 물으면 경우의 수를 구하는 문제입니다. |
| 순열 | 여러 개의 것을 순서를 구별해서 나열한 것, 또는 그 방법의 수입니다. 한 줄로 나열하는 경우를 특히 직순열이라고 하며 \({}_{n}\mathrm{P}_{r}\)로 셉니다. |
| 직순열 | 가로 한 줄(직선)로 나열하는 보통의 순열입니다. 원순열과 구별하고 싶을 때 이렇게 부릅니다. 왼쪽부터 차례로 놓이므로 양 끝이 있고, 밀어서 옮기면 다른 배열이 됩니다. |
| 원순열 | 여러 개의 것을 원형(고리 모양)으로 나열하는 방법입니다. 돌려서 겹치는 배열은 같은 1가지로 세는 것이 규칙이며, \(n\)개라면 \((n-1)!\)가지입니다. |
| 염주순열 | 원순열 중에서 뒤집어서 겹치는 배열도 같은 1가지로 세는 것입니다. 목걸이나 팔찌처럼 뒤집을 수 있는 고리를 셀 때 쓰며, \(n\)이 \(3\) 이상이면 \(\dfrac{(n-1)!}{2}\)가지입니다. |
| 계승 (팩토리얼) | \(1\)부터 \(n\)까지의 정수를 모두 곱한 수입니다(기호는 \(n!\), ‘n 팩토리얼’이라고 읽습니다). \(n\)개를 한 줄로 나열하는 방법의 수와 같고, \(n\)이 커지면 폭발적으로 커집니다(\(10! = 3{,}628{,}800\)). |
| 회전하여 겹친다 | 고리 모양의 배열을 그대로 돌렸을 때 다른 배열과 똑같아지는 것입니다. 원순열에서는 이렇게 겹치는 배열을 구별하지 않고 같은 1가지로 셉니다. 한 바퀴 도는 동안 \(n\)가지가 겹칩니다. |
| 뒤집어서 겹친다 | 고리를 뒤집으면(거울에 비친 것처럼 왼쪽과 오른쪽을 바꾸면) 다른 배열과 같아지는 것입니다. 염주순열에서는 이것도 같은 1가지로 셉니다. |
| 한 묶음으로 보기 | ‘반드시 이웃한다’는 조건이 있는 것끼리 끈으로 묶어 1개로 다루는 생각입니다. 전체 개수가 1개 줄고, 마지막에 묶음 안의 순서의 수를 곱합니다. |
| 여사건 | 어떤 조건이 일어나지 않는 경우 전체로, \(A^{C}\)로 씁니다. ‘이웃하지 않는다’처럼 직접 세기 어려운 조건은 전체에서 ‘이웃하는’ 경우를 빼서 구합니다. |
| 중복해서 세기 | 같은 것을 2번 이상 세어 버리는 것입니다. 원순열에서는 같은 고리 배열을 \(n\)번씩 세게 되므로, 마지막에 \(n\)으로 나누어 겹친 것을 없앱니다. |
| 하나를 고정하기 | 원순열의 대표적인 생각법입니다. 누군가 한 사람의 위치를 먼저 정해 버리면 더 이상 돌려서 겹치게 할 수 없으므로, 나머지 \(n-1\)개를 한 줄로 나열하는 것과 같아집니다. |
| 곱의 법칙 | ‘A를 정하는 방법이 \(a\)가지이고, 그 각각에 대해 B를 정하는 방법이 \(b\)가지’이면 전체는 \(a \times b\)가지라는 세는 법의 규칙입니다. 묶음의 원순열에 순서 \(2\)가지를 곱하는 것도 이 법칙입니다. |
먼저 알아 두면 좋은 내용
이 페이지의 계산을 ‘의미를 알고’ 쓸 수 있도록, 먼저 알아 두면 좋은 내용을 정리했습니다.
막히면 이 표의 내용으로 돌아가 복습하는 것이 지름길입니다.
| 경우의 수의 기초(중학교 2학년~고등학교 1학년, 13~16세) |
|
| 순열과 계승(고등학교 1학년, 15~16세) |
|
| 나눗셈으로 겹친 것을 없애는 생각(초등학교 3~4학년, 9~10세) |
|
| 도형의 회전과 대칭(초등학교 5학년~중학교 1학년, 10~13세) |
|
| 여사건(고등학교, 15~18세) |
|
Excel로 계산하는 방법
| 나열할 것의 개수 n | 8 |
| 원순열의 수 (n−1)! | =FACT(B1-1) |
| 전체 개수 n | 8 |
| 원형으로 나열하는 개수 r | 3 |
| 한 줄로 나열하는 방법의 수 nPr | =PERMUT(B1,B2) |
| 원순열의 수 nPr÷r | =B3/B2 |
| 나열할 것의 개수 n | 5 |
| 염주순열의 수 | =IF(B1<=2,1,FACT(B1-1)/2) |
| 나열할 것의 개수 n | 6 |
| 조건이 없는 원순열 (n−1)! | =FACT(B1-1) |
| 2개가 이웃함 2×(n−2)! | =2*FACT(B1-2) |
| 2개가 이웃하지 않음 | =B2-B3 |
FACT는 계승(n!), PERMUT는 순열(nPr)을 계산하는 함수입니다.
첫 번째 표는 8명이 원탁에 앉는 경우로, 답은 5040입니다.
두 번째 표는 8명 중 3명을 원탁에 앉히는 경우로, nPr이 336이고 r로 나누면 112가 됩니다.
세 번째 표의 IF는 2로 나누면 안 되는 n이 2 이하인 경우를 처리합니다. n에 5를 넣으면 12가 됩니다.
네 번째 표는 6명이 원탁에 앉는 예로, 조건이 없으면 120, 이웃하는 경우 48, 이웃하지 않는 경우 72입니다.
Google 스프레드시트로 계산하는 방법
| 나열할 것의 개수 n | 8 |
| 원순열의 수 (n−1)! | =FACT(B1-1) |
| 전체 개수 n | 8 |
| 원형으로 나열하는 개수 r | 3 |
| 한 줄로 나열하는 방법의 수 nPr | =PERMUT(B1,B2) |
| 원순열의 수 nPr÷r | =B3/B2 |
| 나열할 것의 개수 n | 5 |
| 염주순열의 수 | =IF(B1<=2,1,FACT(B1-1)/2) |
| 나열할 것의 개수 n | 6 |
| 조건이 없는 원순열 (n−1)! | =FACT(B1-1) |
| 2개가 이웃함 2×(n−2)! | =2*FACT(B1-2) |
| 2개가 이웃하지 않음 | =B2-B3 |
Python으로 계산하는 방법
from math import factorial, perm
n = 8 # 나열할 것의 개수
r = 3 # 원형으로 나열하는 개수(n개 중에서 뽑을 때)
# 원순열: n개 모두를 원형으로 나열
circular = factorial(n - 1)
# 원순열: n개에서 r개를 뽑아 원형으로 나열
circular_select = perm(n, r) // r
# 염주순열: 뒤집어서 겹치는 것은 같은 것으로 봄
# n이 1 또는 2이면 뒤집어도 배열이 바뀌지 않으므로 2로 나누지 않고 1가지
necklace = 1 if n <= 2 else factorial(n - 1) // 2
# 특정한 2개가 이웃하는 / 이웃하지 않는 원순열(n이 3 이상일 때)
adjacent = 2 * factorial(n - 2)
not_adjacent = factorial(n - 1) - adjacent
print(f"원순열: {circular}가지")
print(f"{n}개 중 {r}개의 원순열: {circular_select}가지")
print(f"염주순열: {necklace}가지")
print(f"이웃함: {adjacent}가지 이웃하지 않음: {not_adjacent}가지")
LaTeX 등 수식 언어로 쓰는 법(복사 가능)
N = n! ÷ n = (n−1)!
N = \frac{n!}{n} = (n-1)!
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>N</mi>
<mo>=</mo>
<mfrac>
<mrow><mi>n</mi><mo>!</mo></mrow>
<mi>n</mi>
</mfrac>
<mo>=</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo>)</mo><mo>!</mo>
</mrow>
</math>
N = (n!)/n = (n-1)!
N = (n - 1)!
N := (n-1)!;
N = factorial(n-1);
N = n!/n = (n-1)!
N = ₙPᵣ ÷ r
N = \frac{{}_{n}P_{r}}{r}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>N</mi>
<mo>=</mo>
<mfrac>
<mrow><mmultiscripts><mi>P</mi><mi>r</mi><none/><mprescripts/><mi>n</mi><none/></mmultiscripts></mrow>
<mi>r</mi>
</mfrac>
</mrow>
</math>
N = (nPr)/r
N = (n!/(n - r)!)/r
N := numbperm(n, r)/r;
N = nchoosek(n,r)*factorial(r)/r;
N = nPr/r
M = (n−1)! ÷ 2
M = \frac{(n-1)!}{2}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>M</mi>
<mo>=</mo>
<mfrac>
<mrow><mo>(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo>)</mo><mo>!</mo></mrow>
<mn>2</mn>
</mfrac>
</mrow>
</math>
M = ((n-1)!)/2
M = (n - 1)!/2
M := (n-1)!/2;
M = factorial(n-1)/2;
M = (n-1)!/2
A = 2 × (n−2)!
A = 2 \times (n-2)!
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>A</mi>
<mo>=</mo>
<mn>2</mn>
<mo>×</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>2</mn><mo>)</mo><mo>!</mo>
</mrow>
</math>
A = 2 * (n-2)!
A = 2 (n - 2)!
A := 2*(n-2)!;
A = 2*factorial(n-2);
A = 2(n-2)!
B = (n−1)! − 2 × (n−2)!
B = (n-1)! - 2 \times (n-2)!
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>B</mi>
<mo>=</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo>)</mo><mo>!</mo>
<mo>−</mo>
<mn>2</mn>
<mo>×</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>2</mn><mo>)</mo><mo>!</mo>
</mrow>
</math>
B = (n-1)! - 2 * (n-2)!
B = (n - 1)! - 2 (n - 2)!
B := (n-1)! - 2*(n-2)!;
B = factorial(n-1) - 2*factorial(n-2);
B = (n-1)! - 2(n-2)!
ChatGPT 에게 물어서 계산하는 방법
당신은 수학(경우의 수) 계산 도우미입니다. 다음 계산을 Python 코드를 실제로 실행해서 하고, 실행 결과의 숫자만을 근거로 답하세요(암산이나 추측으로 답하지 마세요). 8명이 원탁에 앉는 방법에 대해 다음 4가지를 구하세요. 1. 8명 모두의 원순열(돌려서 겹치는 자리 배치는 같은 1가지로 셉니다) 2. 8명 중 3명을 뽑아 3인용 원탁에 앉히는 방법의 수 3. 구슬 8개를 고리로 이을 때의 염주순열(돌리거나 뒤집어서 겹치는 배열은 1가지로 셉니다) 4. 8명이 앉는 원탁에서 특정한 2명이 이웃하게 앉는 방법의 수와 이웃하지 않게 앉는 방법의 수 Python의 표준 math 모듈(factorial, perm)로 정확하게 계산하고, 사용한 공식과 실행 결과의 숫자를 보여 주세요. 또 각 공식이 왜 그런 꼴이 되는지도 설명해 주세요.
사용법
-
1숫자 입력계산하고 싶은 숫자를 입력란에 입력합니다
-
2계산‘계산’ 버튼을 누릅니다
-
3결과 확인계산 결과가 바로 표시됩니다. 계산의 원리와 공식 해설도 같은 페이지에서 확인할 수 있습니다
DataChef의 특징
전문 지식 없이도 직관적이고 간단하게 사용
개인정보를 등록하지 않고도 이용할 수 있습니다
"다운로드"를 누르면 파일이 자동으로 삭제됩니다
출처 표기 불필요
상업적 이용 허가 연락도 필요 없습니다