Competition/Baekjoon

[백준] 11004번 자바 퀵소트

bisi 2020. 3. 16. 10:18
문제 출처 

https://www.acmicpc.net/problem/11004

 

11004번: K번째 수

수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

 

접근 방식 및 풀이

- 퀵소트을 활용하면 금방 풀수 있다. 

- 2751번을 먼저 선행해서 풀고 오면 더 쉽게 풀 수 있다.

[Algorithm/백준] - [백준] 2751번 자바 퀵소트

 

- 코드는 아래 블로그 참고했다.

https://fbtmdwhd33.tistory.com/86?category=737465

 

[백준,BOJ 11004] k번째 수( JAVA 구현)

-내 생각 우선 이 문제를 보면, 단순하게 자바에서 제공하는 Arrays.sort()를 이용하여 정렬 후 k번 째 수를 출력하면 되는 간단한 문제라고 생각했다. 그러나 결과는 시간 초과가 발생하였고, 입력 값의 수가 많..

fbtmdwhd33.tistory.com

 

 

 

소스 코드 
import java.util.*;
import java.math.*;
import java.io.*;

public class Main  {
	
	 	static int k,n;
		public static int partition(int[] array, int left, int right) {
		    int mid = (left + right) / 2; 
		    swap(array, left, mid); // 중앙 값을 첫 번째 요소로 이동
		 
		    int pivot = array[left];
		    int i = left, j = right;
		 
		    while (i < j) {
		        while (pivot < array[j]) { // j는 오른쪽에서 왼쪽으로 피봇보다 작거나 같은 값을 찾는다.
		            j--;
		        }
		 
		        while (i < j && pivot >= array[i]) { // i는 왼쪽에서 오른쪽으로 피봇보다 큰 값을 찾는다.
		            i++;
		        }
		        swap(array, i, j); // 찾은 i와 j를 교환
		    }
		    // 반복문을 벗어난 경우는 i와 j가 만난경우
		    // 피봇과 교환
		    array[left] = array[i];
		    array[i] = pivot;
		    return i;
		}
		 
		public static void swap(int[] array, int a, int b) {
		    int temp = array[b];
		    array[b] = array[a];
		    array[a] = temp;
		}
		 
		public static void quicksort(int[] array, int left, int right) {
		    if (left >= right) {
		        return;
		    }
		 
		    int pi = partition(array, left, right);
		    
		   // partition과정을 통해 구한 구분점에 +1한 값과 k를 비교하여 해당하는 부분집합에 대해
           // 재귀호출을 반복한다.
		    if(pi+1 == k) return;
		    else if(pi+1<k)
		    	quicksort(array, pi + 1, right);
		    else
		    	quicksort(array, left, pi - 1);
		    
		}


		
		public static void main(String[] args) throws IOException {
			 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			 StringTokenizer st = new StringTokenizer(br.readLine());
			 
			 n =Integer.parseInt(st.nextToken());
			 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());
				 
			 }
			 
			 quicksort(arr,0,n-1);
		       
			 System.out.println(arr[k-1]);
		     
			
				
		       
		}
	
}

 

 

 

 

결과 

 

'Competition > Baekjoon' 카테고리의 다른 글

[백준] 1976번 그래프  (0) 2020.03.17
[백준] 2751번 자바 퀵소트  (0) 2020.03.15
[백준] 10989번 자바 수 정렬  (0) 2020.03.14