AtCoder Educational DP T. Permutation 풀이 피드백

카카오 데이터 센터 화재로 티스토리 블로그가 접속이 안돼 백준 블로그를 이용합니다.

앳코더에서는 PS에서 자주 등장하는 동적 계획법 유형들을 26가지로 정리한 Educational DP Contest를 제공하고 있습니다.

이 블로그에서는 T번 문제인 Permutation의 풀이를 더 쉽게 이해할 수 있는 피드백을 제공합니다.

기존 풀이?

해당 문제를 검색했을 때 나오는 블로그에서는 점화식을 다음과 같이 설명하고 있습니다.

$dp_{i, j}$ := i번째 수까지 1, 2, ..., i를 써서 완성했을 때 i번째 원소가 j인 경우의 수

그리고 테이블을 채우는 방법은 다음 식으로 표현됩니다.

$$dp_{i, j} = \begin{cases} \sum\limits_{k = 1}^{j - 1} dp_{i - 1, k} & (s_{i - 1} = <) \\ \sum\limits_{k = j}^{i - 1} dp_{i - 1, k} & (s_{i - 1} = >) \end{cases}$$

하지만 저는 이해가 잘 되지 않았습니다. 왜냐하면 순열 중간에 i보다 큰 원소가 당연히 낄 수 있는데 설명에서는 이를 고려하지 않고 원소 집합을 $\{1, 2,..., i\}$로 고정했기 때문입니다.

점화식 재정의

설명에는 첫 i - 1개의 수를 1,... , i - 1로 고정하면서 전이를 한다고 했지만 잘 와닿지 않았습니다. 저는 설명을 곱씹어 봤고, 기존의 설명을 더 직관적으로 이해하기 위해선 점화식을 다음과 같이 정의해야 한다는 결론을 내렸습니다.

$dp_{i, j}$ := i번째 원소까지 완성했을 때 i번째 수가 j번째로 작은 수일 경우의 수

이러면 테이블을 채우는 방법이 완벽히 설명됩니다.

문자가 <일 경우 j보다 작은 순서의 원소들, 즉 순서(순위)가 [1, j - 1]인 원소로 끝나는 경우의 수를 더한다고 이해할 수 있습니다.

문자가 >일 경우는 i - 1개의 원소에 더해 추가했을 때 마지막 원소는 j번째로 작은 원소가 된다는 뜻입니다. 그러면 원소를 추가하지 않았을 때 j번째로 작은 원소를 $j_{old}$라고 합시다. j를 추가하면 $j_{old}$의 순서는 하나 증가한 $j_{old} + 1$이 됩니다. 이런식으로 기존의 원소들의 순위가 하나씩 밀리고 이에 대한 계산은 $\sum\limits_{k = j}^{i - 1} dp_{i - 1, k}$으로 치환됩니다.

이렇게 n번째 원소까지 채우면 조건을 만족하는 순열의 개수를 모두 구할 수 있게 됩니다.

설명에 틀린 부분이 있을 수 있습니다. 설명에 잘못된 부분을 지적해주시거나 더 좋은 설명을 댓글로 알려주신다면 오류도 고칠 수 있고 추후 저와 같은 의문을 가졌던 분이 시행착오를 줄일 수 있어 큰 도움이 될 것 같습니다.


댓글 댓글 쓰기