import java.util.Arrays;
public class NextPermutationTest {
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
// Step 1: a<b 를 만족하는 두 수 찾기!!
// arr[i]< arr[i+1]
// 위의 식을 만족하는 것을 찾는데 가장 오른쪽에 있는것을 선택
// 그리고 arr[i]의 i가 기준점(피벗)이 된다!!
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
// Step 2: i번지의 값보다 큰값을 뒤에서 부터 찾기!! ==>찾았으면 swap
if (i >= 0) {
int j = nums.length - 1;
while (nums[i] >= nums[j]) {
j--;
}
swap(nums, i, j);
}
// Step 3: i번지 뒤의 숫자들을 오름차순으로 정렬 (반전)
reverse(nums, i + 1);
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums, int start) {
int end = nums.length - 1;
while (start < end) {
swap(nums, start, end);
start++;
end--;
}
}
public static void main(String[] args) {
NextPermutationTest np = new NextPermutationTest();
int[] nums = {1, 3, 2};
np.nextPermutation(nums);
System.out.println(Arrays.toString(nums)); // 출력: [1, 3, 2]
}
}