[필수 문제] k번째 큰 수 찾기

2021. 2. 13. 01:50코딩 테스트/필수 문제

1. 문제

N개의 자연수가 주어질 때, 이 자연수들 중에서 k번째로 큰 수를 찾는 프로그램을 작성하시오. 만약 k=1 이라면, 가장 큰 수를 찾으면 된다.


입력

첫 번째 줄에 자연수 N, k가 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ k ≤ 10) 두 번째 줄에 N개의 자연수가 주어진다. 

출력

첫 번째 줄에 k번째 수를 출력한다.

예제 입력

10 3
1 5 2 3 8 4 7 3 2 10

예제 출력

7

 

 

 

2. 풀이

이 문제는 시간 복잡도를 고려하여 풀어야한다.

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        // Arrays.sort(arr);
        for(int i = 0; i < k; i++) {
            for(int j = 0; j < n-1; j++) {
                if(arr[j] > arr[j+1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                }
            }
        }

        bw.write(arr[n-k] + "");
        br.close();
        bw.flush();
        bw.close();
    }

}

만약 다음과 같이 풀이할 경우, O(n^2)의 시간이 소요된다. 즉, 주어진 N의 범위를 생각한다면 10,000,000,000 번의 시간이 소요된다. 따라서 k번 만큼의 루프를 돌아 시간복잡도를 생각하여 풀어야한다는 점이 이 문제의 가장 중요한 요점이다.

for(int i = 0; i < n; i++) {
    for(int j = 0; j < n-1; j++) {
        if(arr[j] > arr[j+1]) {
            int tmp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = tmp;
        }
    }
}
728x90

'코딩 테스트 > 필수 문제' 카테고리의 다른 글

[필수 문제] 큰 자릿수 뺄셈  (0) 2021.02.13
[필수 문제] streetree  (0) 2021.02.13
[필수 문제] baseball  (0) 2021.02.13
[필수 문제] bingo  (0) 2021.02.13