본문 바로가기

BOJ/C++

[BOJ] 10972, 10973 다음 순열 / 이전 순열

*이전 순열의 경우에는 맨 뒤의 인덱스부터 이전 인덱스와 비교하면서 뒤쪽에 나보다 작은 수가 존재하는 경우가 자리를 바꾸는 경우이다. 

-> 4 자리의 순열일 경우 

1 2 3 4 라면 0번 인덱스의 값인 [1]이 가장 작은 값이므로 뒤에 이보다 작은 값이 없다.

즉, 가장 처음 순열이라는 것이다. 

 

*이런 특성을 이용해서 idx를 찾는다.

*이 idx와 자리를 바꿀 인덱스를 찾아야 한다. 

바로 이전이라고 했기 때문에 idx보다 뒤에 있으면서 큰 수를 찾아야 한다. n부터 idx까지 비교하면서 idx의 값보다 작으면서 가장 뒤에있는 수를 찾는다. 

4 2 1 3 일 때 idx는 2가 된다. (바로 뒤에 1이라는 작은 수가 있기 때문에)

idx2는 2보다 뒤에 있으면서 2보다 작은 수인 1이 된다. 

 

*여기까지 idx와 idx2가 구해졌다. 

이 둘을 바꾼다. (swap)

=:> 4 1 2 3 

하지만 이게 정답은 아니다. 바로 이전이라고 했기 때문에 이전의 순열 중 가장 큰 값이 되어야 하기 때문이다. 

 

*idx+1에서 n까지 내림차순으로 정렬한다. 

 

*다음 순열은 이전 순열과 부등호만 반대로 하면 된다. 

이전 순열

다음 순열

'BOJ > C++' 카테고리의 다른 글

[BOJ] 1520. 내리막길  (0) 2020.03.13
[BOJ] 11723. 집합  (0) 2020.03.12
[BOJ] 9466. 텀 프로젝트  (0) 2020.03.12
[BOJ] 13911. 집 구하기  (0) 2020.03.11
잃어버린 괄호  (0) 2020.03.09