문제
백준 25568
설명
이 문제는 두가지를 이해해야한다.
- 블럭 조합이 2개 뿐이다.
- 맨 위부터 3개의 순서가 정해지면 이후에는 그 순서만들 따라야한다.
- 1 번째 줄은 바꿀 수 없으므로 2번째 줄을 바꾼 총 2개의 패턴만 만들 수 있다.
- 양쪽 모두 필요한 색깔이 들어가는 교환은 우선시 해야한다. (그리디)
- 예를들어
1002
를 0120
으로 만들어야한다고 해보자. 한쪽만 필요한 색깔이 들어가도록 교환하면 1002->0012->0210->0120
의 결과가 된다. 양쪽이 모두 만족하는 교환을 먼저 시행하면 1002->0102->0120
으로 더 빠르다.
이러한 갯수를 세기 위해 BruteForce 를 수행할 수도 있다. O(N) 에 탐색을 마칠 수 있으므로 시간복잡도 상으로는 차이가 나지 않는다. 하지만 이를 수식적으로 풀 수도 있다.
- 한 줄을
그룹 0, 1, 2
로 나누고 그 안에는 0
, 1
, 2
만이 들어간다고 하자. 그리고 G(n, x)
를 n
그룹 안에 있는 초기 x
의 갯수라고 하자.
G(0, 1) + G(0, 2)
만큼은 무조건 교환을 해야한다. 그러면 그룹 1
에는 1
, 2
만이 담겨 있을 것이고, 이때 2
의 갯수는 G(1, 2) + 그룹 0 과 교환해서 얻은 2
로 나눌 수 있다. 이는 그룹 2
에도 똑같이 적용할 수 있다.
그룹 0 과 교환해서 얻은 2
같은 교환 부산물은 그리디하게 교환하면 한쪽에만 존재한다. 만약 그룹 0 과 교환해서 얻은 2
가 양수라면 G(1, 2) + 그룹 0 과 교환해서 얻은 2 = G(2, 1)
이 성립한다.
- 따라서 총 교환량은
G(0, 1) + G(0, 2) + max(G(1, 2), G(2, 1))
이 된다.
이러한 전략를 사용할 수 있는 문제로 모양 정돈 이 있다.
시간 복잡도
O(\(\mathrm{N}\))
코드 2 (수식)
코드 2 (BruteForce)
댓글남기기