1. 문제

https://www.acmicpc.net/problem/2505

2. 코드

   public static void main(String[] args) {
        // int[] input = { 6, 7, 8, 2, 1, 5, 4, 3, 9, 10 };
        // int[] input = { 6, 7, 4, 3, 2, 1, 5, 8, 9, 10 };
        // int[] input = { 1, 2, 4, 3, 5, 6, 7, 9, 8, 10 };
        // int[] input = { 1, 2, 8, 7, 5, 6, 4, 3, 9, 10 };
        int[] input = { 1, 2, 3, 4, 7, 10, 9, 8, 5, 6 };

        int[] reverse1 = null;
        int[] reverse2 = null;

        if (input[0] != 1) {
            reverse1 = front(input);
        } else {
            reverse1 = back(input);
        }

        if (reverse1[0] != 1) {
            reverse2 = front(reverse1);
        } else {
            reverse2 = back(reverse1);
        }

        for (int i : reverse2) {
            System.out.print(i + " ");
        }
    }

    public static int[] front(int[] input) {
        boolean started = false;
        int num = 0;
        int start = 0;
        int end = 0;

        for (int i = 0; i < input.length; i++) {
            if (!started && input[i] != i + 1) {
                start = i;
                num = i + 1;
                started = true;
            } else if (started && input[i] == num) {
                end = i;
                break;
            }
        }

        int[] result = reverse(true, input, start, end);
        System.out.println((start + 1) + " " + (end + 1));
        return result;
    }

    public static int[] back(int[] input) {
        boolean started = false;
        int num = 0;
        int start = 0;
        int end = 0;

        for (int i = input.length - 1; i >= 0; i--) {
            if (!started && input[i] != i + 1) {
                end = i;
                num = i + 1;
                started = true;
            } else if (started && input[i] == num) {
                start = i;
                break;
            }
        }
        int[] result = reverse(false, input, start, end);
        System.out.println((start + 1) + " " + (end + 1));
        return result;
    }

    public static int[] reverse(boolean front, int[] input, int start, int end) {
        int[] result = input.clone();

        if (front) {
            for (int i = start; i < end + 1; i++) {
                result[i] = input[end + start - i];
            }
        } else {
            for (int i = end; i >= start; i--) {
                result[i] = input[end + start - i];
            }
        }
        return result;
    }