만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Merge Not Sort

면접 대비

시간 제한2초메모리 제한1024 MB

요약
1부터 2N까지의 순열 C를 길이 N인 두 배열 A, B로 나누어 주어진 병합 과정이 C를 출력하게 합니다. 불가능하면 -1을 출력합니다.
난이도

보통10점 중 5점

유형
그리디, 배열, 시뮬레이션
정답자
아직 제출이 없습니다

문제

당신은 병합 정렬(Merge Sort) 알고리즘을 연구하고 있다. 병합 정렬은 분할 정복 원리를 바탕으로 한 정렬 알고리즘이다. 배열을 길이가 같은 두 부분 배열로 나누고, 각각을 정렬한 뒤 정렬된 두 부분 배열을 합쳐 최종적으로 정렬된 배열을 만든다.

특히 병합 과정에 관심이 있다. 흔히 쓰는 병합 구현은 두 부분 배열의 첫 원소를 반복해서 비교하고, 더 작은 원소를 새 배열로 옮긴다. 병합 알고리즘은 다음 의사 코드로 나타낼 수 있다.

Merge(A[1..N], B[1..N]):
    C = []
    i = 1
    j = 1
    while i ≤ N AND j ≤ N:
        if A[i] < B[j]:
            append A[i] to C
            i = i + 1
        else:
            append B[j] to C
            j = j + 1
    while i ≤ N:
        append A[i] to C
        i = i + 1
    while j ≤ N:
        append B[j] to C
        j = j + 1
    return C

배열 A와 B가 정렬되어 있지 않을 때 병합 알고리즘이 어떻게 동작하는지 알고 싶다. 예를 들어 A=[3,1,6]A = [3, 1, 6], B=[4,5,2]B = [4, 5, 2]이면 Merge(A,B)=[3,1,4,5,2,6]\text{Merge}(A, B) = [3, 1, 4, 5, 2, 6]이다.

병합 알고리즘의 동작을 더 깊이 이해하기 위해 다음 문제를 풀어 보자. 길이가 2⋅N2 \cdot N인 배열 CC가 주어지며, CC는 11부터 2⋅N2 \cdot N까지의 수를 한 번씩 포함하는 순열이다. 길이가 각각 NN인 배열 AA와 BB를 만들어 Merge(A,B)=C\text{Merge}(A, B) = C가 되게 하거나, 그것이 불가능한지 판단하라.

입력

첫째 줄에 정수 NN (1≤N≤10001 ≤ N ≤ 1000)이 주어진다.

둘째 줄에 2⋅N2 \cdot N개의 정수 CiC_i가 주어진다. 배열 CC는 11부터 2⋅N2 \cdot N까지의 수를 한 번씩 포함하는 순열이다.

출력

Merge(A,B)=C\text{Merge}(A, B) = C를 만족하는 길이 NN의 배열 AA와 BB를 만들 수 없으면 -1을 출력한다. 그렇지 않으면 첫째 줄에 AiA_i를 NN개, 둘째 줄에 BiB_i를 NN개 출력한다. 가능한 답이 여러 개이면 그중 하나를 출력한다.

예제3

  1. 예제 1

    입력
    3
    3 1 4 5 2 6
    
    예상 출력
    3 1 6
    4 5 2
    
  2. 예제 2

    입력
    4
    1 2 3 4 5 6 7 8
    
    예상 출력
    2 3 5 7
    1 4 6 8
    
  3. 예제 3

    입력
    2
    4 3 2 1
    
    예상 출력
    -1