아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

알고리즘 수업 - 병합 정렬 3

시간 제한1초메모리 제한512 MB

요약
서로 다른 정수 배열 A와 B가 주어졌을 때, 병합 정렬로 A를 정렬하는 도중 A가 B와 같아지는 순간이 있는지 판별합니다.
난이도

보통10점 중 6점

유형
시뮬레이션, 분할 정복, 배열
정답자
아직 제출이 없습니다

문제

서준이는 오늘도 병합 정렬 수업의 조교를 맡았다. 아빠가 가르친 내용을 학생들이 제대로 이해했는지 이 문제로 확인해 보자.

NN개의 서로 다른 양의 정수가 저장된 배열 AA가 있다. 병합 정렬로 배열 AA를 오름차순으로 정렬할 때, 정렬 과정에서 배열 AA가 배열 BB와 같아지는 경우가 발생하는지 확인해 보자. 초기 상태의 배열 AA도 정렬 과정에서 발생할 수 있는 경우로 생각한다.

크기가 NN인 배열에 대한 병합 정렬 의사 코드는 다음과 같다.

merge_sort(A[p..r]) { # A[p..r]을 오름차순 정렬한다.
    if (p < r) then {
        q <- ⌊(p + r) / 2⌋;       # q는 p, r의 중간 지점
        merge_sort(A, p, q);      # 전반부 정렬
        merge_sort(A, q + 1, r);  # 후반부 정렬
        merge(A, p, q, r);        # 병합
    }
}

# A[p..q]와 A[q+1..r]을 병합하여 A[p..r]을 오름차순 정렬된 상태로 만든다.
# A[p..q]와 A[q+1..r]은 이미 오름차순으로 정렬되어 있다.
merge(A[], p, q, r) {
    i <- p; j <- q + 1; t <- 1;
    while (i ≤ q and j ≤ r) {
        if (A[i] ≤ A[j])
        then tmp[t++] <- A[i++]; # tmp[t] <- A[i]; t++; i++;
        else tmp[t++] <- A[j++]; # tmp[t] <- A[j]; t++; j++;
    }
    while (i ≤ q)  # 왼쪽 배열 부분이 남은 경우
        tmp[t++] <- A[i++];
    while (j ≤ r)  # 오른쪽 배열 부분이 남은 경우
        tmp[t++] <- A[j++];
    i <- p; t <- 1;
    while (i ≤ r)  # 결과를 A[p..r]에 저장
        A[i++] <- tmp[t++]; 
}

입력

첫째 줄에 배열 A, B의 크기 NN(55 ≤ NN ≤ 500,000500{,}000)이 주어진다.

다음 줄에 배열 A의 원소 A1A_1, A2A_2, ..., ANA_N이 주어진다. 모든 원소는 서로 다르다. (11 ≤ AiA_i ≤ 10910^9)

다음 줄에 배열 B의 원소 B1B_1, B2B_2, ..., BNB_N이 주어진다. (11 ≤ BiB_i ≤ 10910^9)

출력

병합 정렬로 배열 A를 오름차순으로 정렬하는 과정에서 배열 A가 배열 B와 같아지는 경우가 발생하면 1을, 그렇지 않으면 0을 출력한다.

예제2

  1. 예제 1

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

    입력
    5
    4 5 1 3 2
    1 2 3 5 4
    
    예상 출력
    0