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]
    }
}

'코딩테스트' 카테고리의 다른 글

백준 - 9081 번 단어 맞추기  (0) 2025.04.12
SORT 정리 / ArrayTesr  (0) 2025.04.12
CompleteBinaryTree(완전이진탐색)  (0) 2025.04.11
백준 - 1158 번 요세푸스  (0) 2025.04.11
백준 - 10845번  (0) 2025.04.11

+ Recent posts