문제 : https://leetcode.com/problems/next-permutation/
정수 배열이 있을 때 해당 배열의 요소들의 순서를 바꿔서 사전순 다음 시퀀스로 만들어라. 만일 불가능하다면 사전순 가장 작은 순서로 재배열해야한다.
예를 들어, arr = [2, 1, 3]이라면 사전순 다음 순서인 [2, 3, 1]로 재배열 시켜야한다.
전부 내림차순으로 정렬된 순열의 다음 사전순 배열은 이들을 역순한 것과 같다.
예를 들어, arr = [3, 2, 1]의 경우 다음 사전순 배열은 [1, 2, 3]이다.
내림차순된 배열의 다음 사전순 배열을 구하는 방법을 알았으니 내림차순 배열의 가장 앞에 있는 숫자를 해당 숫자보다 큰 수들보다 가장 작은 수로 바꾸면 다음 사전순 배열을 구할 수 있다.
말이 좀 어려우니, arr = [1, 3, 5, 4, 2] 를 예로 들어보자. 뒤에서부터 내림차순 배열인 것을 구해보면 [5, 4, 2]이다.
이 배열의 앞에 있는 수는 3이다. 이제 3보다 큰 수들 중에 가장 작은 수를 구해야 한다.
문제에서 배열의 요소들의 순서를 바꿔서 구하라고 했기 때문에 배열에 존재하는 수들 중 하나로 대체되어야 한다.
사전순 다음 순열을 구하기 위해서는 앞에 수는 웬만하면 바꾸면 안되고 뒤에서부터 수를 조정해야 한다. 따라서 뒤에 있는 내림차순 배열([5,4,2])을 앞에서부터 탐색하면서 조건에 만족하는 수를 구한다. 예시에서 이 수는 4가 된다. 이제 두 수를 바꿔준다. 두 수를 바꾸면 arr = [1, 4, 5, 3, 2] 가 된다. 수를 바꿔도 내림차수 배열은 여전히 정렬되어 있음을 확인할 수 있다. 이제 해당 내림차순 배열을 역순으로 바꿔주면 정답이 된다. [1, 4, 2, 3, 5]
시간복잡도는 O(N).
소스코드 : https://github.com/fpdjsns/Algorithm/blob/master/leetcode/medium/31.%20Next%20Permutation.cpp
참고 : https://leetcode.com/problems/next-permutation/solution/
'알고리즘 문제 > Leetcode' 카테고리의 다른 글
[Leetcode] 731. My Calendar II (0) | 2022.04.12 |
---|---|
[Leetcode] 703. Kth Largest Element in a Stream (2) | 2022.04.08 |
[Leetcode] 287. Find the Duplicate Number (0) | 2022.04.01 |
[Leetcode] 410. Split Array Largest Sum (0) | 2022.03.31 |
[Leetcode] 74. Search a 2D Matrix (0) | 2022.03.31 |
댓글