https://www.acmicpc.net/problem/10978
10978번: 기숙사 재배정
N이 4인 경우, 봄학기 때 4명의 학생 (민수, 동화, 갑도, 석주)이 각각 기숙사 A,B,C,D에 배정이 되었다면, (민수-B, 동화-A, 갑도-D, 석주-C), (민수-B, 동화-C, 갑도-D, 석주-A), (민수-B, 동화-D, 갑도-A, 석주
www.acmicpc.net
23/12/08
단순 교란 순열 문제이다. 알면 매우 쉽게 해결할 수 있다.
문제 접근 방식:
그냥 문제를 보면 교란 순열의 개수를 구하는 것과 같음을 알 수 있다.
교란 순열에 대한 간략한 설명은 다음 링크를 참고하자.
https://ko.wikipedia.org/wiki/%EC%99%84%EC%A0%84%EC%88%9C%EC%97%B4
완전순열 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 조합론에서 완전순열(영어: complete permutation) 또는 교란(영어: derangement 디레인지먼트[*])은 모든 원소의 위치를 바꾸는 순열이다. 집합 S {\displaystyle S} 의 순열 (
ko.wikipedia.org
교란 순열은 어떤 순열이 자기 자신으로 가는 원소가 단 하나라도 존재하지 않는다면, 그 순열을 교란 순열, 혹은 완전 순열이라고 부른다.
이 문제의 상황이 딱 그 상황이다.
$n$번째 교란 순열의 항을 $D_n$이라고 한다면, 교란 순열의 점화식은 다음과 같이 나온다.
$$D_n = (n-1)(D_{n-1} + D_{n-2})$$
그 이유는 다음과 같다. 어떤 교란 순열 $\sigma : (1, \cdots, n) \rightarrow (1, \cdots, n)$이 있다고 하자.
$1$은 어떤 임의의 숫자 $k$로 간다고 하면, 우리는 두 가지 경우로 나눌 수 있다.
1. 임의의 숫자 $k$가 $1$로 가는 경우.
즉, $1$과 $k$는 $k$와 $1$로 간다. 이 경우 나머지 숫자들은 $n-2$개가 존재하므로 이 경우는 $D_{n-2}$와 동일하다.
2. 임의의 숫자 $k$가 $1$로 가지 않는 경우.
즉, 남은 $2$부터 $n$까지의 숫자들 중, $k$는 절대로 $1$로 가지 않으므로, 우리는 $k$를 $1$로 동일 시 할 수 있다. 따라서 이 경우는 $D_{n-1}$과 같다.
이 두 가지 경우 모두 $1$이 $2$부터 $n$까지 갈 수 있으므로 총 $n-1$가지가 나오므로 위와 같은 점화식이 나옴을 확인할 수 있다.
따라서 이 점화식을 그대로 구현하면 끝이다.
아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.
# 10978번 기숙사 재배정
# 교란 순열
D = [0 for _ in range(30)]
D[2] = 1
for i in range(3, 30):
D[i] = (i-1)*(D[i-1] + D[i-2])
for _ in range(int(input())):
print(D[int(input())])
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 31217번 Y (0) | 2024.01.10 |
---|---|
[Python] 31216번 슈퍼 소수 (0) | 2024.01.09 |
[Python] 14503번 로봇 청소기 (0) | 2024.01.08 |
[Python] 23630번 가장 긴 부분 수열 구하기 (0) | 2024.01.07 |
[Python] 14502번 연구소 (0) | 2024.01.07 |