이번 문제는 꽤 재미있는 주제입니다.
인공지능 마르코프 체인을 이야기하다보면, 기대값을 계산하는 부분이 있습니다. 이 부분을 잘 활용하고, 그리고 잦은 중복 호출이 발생하니 동적 계획법도 이용해야 합니다.
문제는 아래와 같습니다.
https://www.acmicpc.net/problem/1521
1521번: 랜덤 소트
첫째 줄에 순열의 크기 N이 주어진다. 둘째 줄에 순열에 들어있는 수 N개가 주어진다. 이 수는 모두 1보다 크거나 같고, N보나 작거나 같으며, 같은 수는 2번 이상 주어지지 않는다. 또, N은 8보다
www.acmicpc.net
마르코프 프로세스에 의하면 우리가 현재 상태(
위의 식을 염두에 두고 프로그램을 해주시면 됩니다.
동적 계획법은 일반적으로 메모리를 할당하고, 그 안에서 처리하고 있지만, 제 경우에는 그냥 해시맵(Hash Map)을 사용했습니다. 파이썬을 이용했기 때문에 딕셔너리(dictionary) 자료구조를 이용했고요.
일단 주어진 수열을 정렬하고, 그 수열인 경우에 대해서는 기대값을 0으로 설정했습니다.
그리고 자기 자신으로 가는 경우도 있겠죠.
메모리 제한이 128MB이므로 모든 상태의 경우를 생각하더라도 8! 자체가 그렇게 크지 않기 때문에 충분합니다. 그리고 실제 역순으로 되어 있다고 해도 실제 경우의 수가 8!에 해당하지는 않습니다.
4321의 경우를 보더라도 나올 수 있는 경우의 수는 3421, 2341, 1324, ..., 1234 형태가 되고 그 수가 8!만큼 많지는 않습니다. 그러므로 메모리 걱정은 안 하셔도 괜찮습니다.
'Programming > BOJ' 카테고리의 다른 글
#1535 안녕 (0) | 2022.09.02 |
---|---|
#1525 퍼즐 (0) | 2022.09.01 |
#1520 내리막 길 (0) | 2022.08.29 |
#1517 버블 소트 (0) | 2022.08.23 |
[C/C++] 백준 #1516 게임 개발(위상 정렬) (0) | 2022.08.23 |
댓글