코린이의 소소한 공부노트

[백준 온라인 저지] 24060. 알고리즘 수업 - 병합 정렬 1 본문

코딩테스트 풀이/JAVA

[백준 온라인 저지] 24060. 알고리즘 수업 - 병합 정렬 1

무지맘 2023. 4. 20. 23:16

1. 입력

- 첫째 줄에 배열 A의 크기 N(5 N 500,000), 저장 횟수 K(1 K 10^8)가 주어진다.

- 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 Ai 10^9)

 

2. 출력

- 병합 정렬을 진행할 때 배열 AK 번째 저장 되는 수를 출력한다. 저장 횟수가 K 보다 작으면 -1을 출력한다.

 

3. 코드

import java.util.*;
import java.io.*;
class Main {
    static int count = 0;
    static int val = -1;
    static int k;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer token = new StringTokenizer(br.readLine());
        int n = Integer.valueOf(token.nextToken());
        k = Integer.valueOf(token.nextToken());
        int[] A = new int[n];
        token = new StringTokenizer(br.readLine());
        for(int i=0 ; i<n ; i++)
            A[i] = Integer.valueOf(token.nextToken());
        merge_sort(A, 0, n-1);
        System.out.print(val);
    }
    
    static void merge_sort(int[] A, int p, int r){
        if(p<r){
            int q = (p+r)/2;
            merge_sort(A, p, q);
            merge_sort(A, q+1, r);
            merge(A, p, q, r);
        }
    }
    
    static void merge(int[] A, int p, int q, int r){
        int i = p, j = q+1, t = 0;
        int[] tmp = new int[r-p+1];
        while(i<=q && j<=r){
            if(A[i]<=A[j])
                tmp[t++] = A[i++];
            else
                tmp[t++] = A[j++];
        }
        while(i<=q)
            tmp[t++] = A[i++];
        while(j<=r)
            tmp[t++] = A[j++];
        i = p; t = 0;
        while(i<=r){
            A[i++] = tmp[t];
            count++;
            if(count==k)
            	val = tmp[t];
            t++;
        }
    }
}