[백준 | Java] 10973 이전 순열

알린·2024년 3월 2일

baekjoon

목록 보기
35/68

내 풀이

바로 전에 푼 다음 순열 문제와 같은 해결 방식인
다음 순열 알고리즘을 적용해 풀었다.
👉 백준 10972 다음 순열 풀이
👉 다음 순열 알고리즘 설명

다음 순열 알고리즘에선 i와 j를 수열 중 가장 큰 수를 찾기 위해 반복문을 사용했다면,
이전 순열 문제를 풀 때는 i와 j를 수열 중 가장 작은 수를 찾기 위해 반복문을 사용하였다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int[] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        arr = new int[N];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        if (check()) {
            for (int i = 0; i < N; i++) {
                System.out.print(arr[i] + " ");
            }
        } else
            System.out.println(-1);
    }

    static boolean check() {
        int i = arr.length-1;
        while (i > 0 && arr[i] > arr[i-1])
            i--;
        if (i <= 0)
            return false;

        int j = arr.length-1;
        while (arr[i-1] < arr[j])
            j--;
        swap(i-1, j);

        j = arr.length-1;
        while (i < j) {
            swap(i, j);
            i++;
            j--;
        }
        return true;
    }

    static void swap(int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

profile
짱이 되고싶은 개발 기록

0개의 댓글