본문으로 바로가기

[기초] 순열

category 알고리즘 & 코딩 테스트/code.plus 2021. 9. 21. 11:51

순열은 순서가 중요하다.

브루트 포스에 어떻게 적용하느냐? 순서가 중요한 브루트 포스에 적용한다.

 

1. 첫 순열을 만든다.

2. 다음 순열을 구한다.

3. 다음 순열을 구한다.

... 마지막 순열이 나올때 까지 구한다.

 

이때, 필요한 것 ( 사전순 일 때)

1. 첫 순열을 구하는 방법 (오름차순..)

2. 다음 순열을 구하는 방법 (C++ STL 의 <algorithm> 에서는 next_permutation 이나 prev_permutaiton 사용 )

3. 마지막 순열을 구하는 방법 (내림차순..)

xx 로 시작하는 마지막 순열을 찾는 것이 중요하다. 사전순이므로, 마지막 순열을 만족하는 것은 내림차순이 얼마나 지속되느냐를 찾는 것과 동일하다.

 

위의 7236541 에서는 723 으로 시작하는 마지막 순열이라고 볼 수 있는 것이다.

 

내림차순 순열의 첫 시작을 i 번째 라고 하자. (7236541 에서는 6이 i 번째 idx 이다.)

 

그렇다면, i - 1 번째를 바꾸어야 다음 순열 즉, xxx 로 시작하는 첫 순열을 만들 수 있다.

 

무엇과 i - 1 번째 (3) 을 바꾸어야 할까?

 

뒤의 내림차순 수열에서, i - 1 번째 보다는 크고 그 중에서는 가장 작은 수를 택해야 한다.

 

바꾸어 준다면 (7236541 -> 7246531) 이 될 것이다.

 

마지막 순열의 내림차순 (6531) 은 항상 내림차순을 만족하기에 이를 뒤집어 준다.

 

-> 7241356

 

723 으로 시작하는 마지막 순열이 724로 시작하는 첫 순열로 바뀌었다!

 

반응형

'알고리즘 & 코딩 테스트 > code.plus' 카테고리의 다른 글

[기초] 다이나믹 프로그래밍  (0) 2021.09.22
[기초] 브루트 포스 - 비트마스크  (0) 2021.09.21
[기초] 백트래킹  (0) 2021.09.05
[기초] 브루트 포스 - 재귀  (0) 2021.09.04
[기초] N과 M  (0) 2021.08.24