해결하려는 문제의 경우의 수를 대략적으로 계산
가능한 모든 방법을 고려
실제 답을 구할 수 있는지 적용
🔑 가능한 모든 방법
순열 : 서로 다른 n개 중에 r개를 선택하는 경우 ( 순서O / 중복X )
// 1,2,3 ≠ 2,1,3 ≠ 3,2,1
같은 데이터를 가지고 순서를 통해 연결되는 이전, 다음 수열을 찾아내는 경우를 계산할 수 있음(?)
// Permutation 함수 구현 가능
그냥 n개를 줄 세우는 경우의 수는 n!
사전 순 정렬을 해보면 어떻게 돌아가는지가 잘 보임
123을 사전순으로 정렬하도록 돌리면
⇒ 123(최초순열) 132 213 231 312 321(최종순열)
1234를 돌리면
⇒ 1234(최초순열) 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321(최종순열)
n개의 데이터가 있고 각 인덱스를 기준으로 0번째 인덱스가 i인 경우중에 1번째 인덱스부터 최초순열은 오름차순, 최종순열은 내림차순으로 나타남
i=1 일 때 ⇒ 1234(최초순열) 1243 1324 1342 1423 1432(최종순열)
0이랑 1로 말했지만 x번째 인덱스를 고정하면(x-1번째까지는 그대로고)
x+1번째 인덱스부터 봤을때 최초순열은 오름차순, 최종순열은 내림차순임
내림차순이 끝나면 다음으로 넘어가야하는데
x번째를 고정하면 x+1부터 끝(n)까지 내림차순인 경우가 최종순열로 끝이나고
다음은 x+1번째부터 오름차순이 되는 최초순열이 돼야함
x는 x+1부터 n까지 자신보다 크지만 가장 작은 숫자와 교환하고
x+1부터 n은 다시 오름차순이 됨
🔑 순열을 구현하는 방법
A[i-1] <= A[i]를 만족하는 i 중 가장 큰 값을 찾는다.(혹은 뒤에서부터 찾는 경우 A[i-1] >= A[i] 중 가장 작은 i를 찾는다.)
→ 현재 i값을 기준으로 이후는 모두 내림차순으로 되는 경우를 찾는 다는 것이다. 현재 기준 최종 순열을 찾음
A배열을 보면 A[i-1] < A[i]가 되는 가장 큰 i는 6인 3번째(0부터 시작)이다. 즉, i=3이 된다.
j >= i 중, A[j] > A[i-1]을 만족하는 가장 큰 j의 값을 찾는다.
→ 현재가 최종 순열 상태이므로 i-1번째 숫자를 변경하여 최초 순열을 찾아야 한다.
A배열을 기준으로 i-1번째 숫자는 3으로 3보다 큰 경우는 6, 5, 4이나 그 중 j 값이 가장 큰 경우는 4이다.
A[i-1]과 A[j]를 Swap한다.
→ i-1인 2번째 숫자 3과 j인 5번째 숫자 4를 변경한다. A 배열은 다음과 같이 변경된다.
A={7, 2, 4, 6, 5, 3, 1}
i이후의 순열을 모두 뒤집는다.
→ 최초 순열 상태로 만들어야 하므로 i번째부터는 오름차순으로 만들어야 한다. A 배열은 다음과 같이 변경된다.
A={7, 2, 4, 1, 3, 5, 6}*
-
-
혜원씨 요새 글이안올라오네요