Algorithm

두 번 뒤집기 (백준 알고리즘 2505번)

OOOooOOoo·2019년 5월 28일·조회 2,134

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

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.