2025. 1. 22. 08:55ㆍ알고리즘 문풀/BOJ 연습
BOI 2016 Swap
순열 이 주어질 때, 에 대해 (순서대로) 와 를 스왑할 수 있는 기회가 한 번씩 주어진다. 이를 적절히 사용하여 만들 수 있는 사전 순 최소 순열을 구하여라.
풀이
의 후보는 셋 뿐이고, 사전 순 최소를 생각하면 이 중 최소인 값이 번 자리에 들어가는 것이 당연하다.
- (자명한 경우) 번 자리에 또는 가 들어가는 경우, 번 자리가 각각 로 강제된다.
- (비자명한 경우) 하지만 이 들어가는 경우 , 가 모두 가능하다. 번 자리가 더 앞쪽이니 이 곳에 작은 수를 배정하는 그리디한 전략이 이득이 아닐까?
아쉽게도 예제 1에서 사실이 아님을 알 수 있다. 둘 중 무엇도 번 자리에 고정될 수 없는 경우 (즉, 인 경우) 어차피 둘 모두 번 자리에 기여할 수 없으니, 번 자리에 둘 중 작은 수를 보내는 것이 이득이 될 수 있다.
어떻게 보면 직관적인 결론인데, 나는 직관적인 방법으로 증명하기는 힘들어서 다음과 같은 방법을 썼다.
의 서브트리에 속한 모든 정점 에 대해, 같은 값을 생각할 수 있다. 를 매우 큰 수로 잡으면 이 값이 작은 것과 사전순으로 작은 것이 동치가 된다.
를 번 자리에 가 들어왔을 때 위 합의 가능한 최솟값이라고 하자. "비자명한 경우"란 여기서 여서 번 자리에 이 들어가는 경우일 것이다.
우리는 여기서 중 더 작은 경우를 찾아야 하는데, 이 둘의 대소관계는 , 의 대소관계와 같다. 즉, 가 더 작은 를 번 자리에 넣으면 된다.
이제 를 번 자리에 를 넣었을 때, 가 이르게 되는 최종 인덱스라고 하자. 라고 하면, 번 인덱스에 를 못 넣는다면 또한 넣을 수 없다. 만약 둘 다 넣을 수 있거나 만 넣을 수 있다면 두 경우 모두 반드시 가 보다 더 작게 된다. 이로부터, 와 중 더 작은 인덱스로 를 보내는 결정을 할 수 있다.
리프 노드에 대해서 이기 때문에 값들을 DP로 관리할 수 있고, 의 조상 노드들과 그 형제 노드만 의 후보가 될 수 있으므로 가능한 상태 공간의 수가 개뿐이다. 따라서 전체 시간 복잡도 에 문제를 해결할 수 있다.
'알고리즘 문풀 > BOJ 연습' 카테고리의 다른 글
BOJ 21268 Do Use FFT (0) | 2025.01.31 |
---|---|
2021 Jan-Feb Problem Solving (0) | 2021.03.04 |
BOJ 10129 작은 새 (0) | 2020.02.10 |
BOJ 17962 Game on a Tree + BOJ 3419 Racing Car Trail (0) | 2020.01.28 |
BOJ 13318 위험한 해싱 (0) | 2020.01.19 |