반응형
백준 11004번 문제 - K번째 수
11004번: K번째 수
수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제 분석

수를 오름차순으로 정렬하고, k번째 수를 알아내는 문제
해결 키 포인트
- 배열을 정렬
- Arrays.sort
- 퀵정렬..?
- 정렬 후 k번째 수 출력 (k번째 수의 index는 k-1)
코드
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// N과 K 입력
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
// 숫자 A 배열 입력
st = new StringTokenizer(br.readLine());
int[] nums = new int[N];
for (int i = 0; i < N; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
// 수 정렬
Arrays.sort(nums);
System.out.println(nums[K - 1]);
}
}
퀵 정렬로 코딩
퀵 정렬로 정렬한 후 k번째 수를 얻어내고자 했는데, 실패했다..
퀵 정렬로 코딩한 코드
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// N과 K 입력
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
// 숫자 A 배열 입력
st = new StringTokenizer(br.readLine());
int[] nums = new int[N];
for (int i = 0; i < N; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
// 퀵 정렬로 k 전 수까지 정렬
quickSort(nums, 0, nums.length - 1, K);
System.out.println(nums[K - 1]);
}
public static void quickSort(int[] arr, int start, int end, int k) {
if (start < end) {
int pivot = partition(arr, start, end);
if (pivot == k)
return;
// pibot이 k보다 클 경우, pibot 앞 배열 중 k값이 존재하는 것이므로 앞만 sort
else if (pivot > k) {
quickSort(arr, start, pivot - 1, k);
}
// pibot이 k보다 작을 경우, pibot 뒤 배열 중 k값이 존재하는 것이므로 뒤만 sort
else {
quickSort(arr, pivot + 1, end, k);
}
}
}
private static int partition(int[] arr, int start, int end) {
// 중앙 값을 pibot으로
int mid = (start + end) / 2;
swap(arr, start, mid);
int pivot = arr[start];
int s=start, e=end;
while(s < e) {
// 피벗보다 작은 수 나올 때까지
while(pivot < arr[e]) {
e--;
}
// 피벗보다 큰 수 나올 때까지
while(s < e && pivot >= arr[s]) {
s++;
}
// s, e 교체
swap(arr, s, e);
}
arr[start] = arr[s];
arr[s] = pivot;
return s;
}
private static void swap(int[] arr, int start, int end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
퀵 정렬 설명
Pivot을 중심으로 계속 데이터를 2개의 집합으로 나누면서 정렬하는 것이 퀵 정렬의 핵심

반응형
'CodingTEST' 카테고리의 다른 글
[백준 1517] 버블 소트 (JAVA) (0) | 2023.07.29 |
---|---|
[백준 2751] 수 정렬하기 2 (JAVA) (0) | 2023.07.29 |
[백준 11399] ATM (JAVA) (0) | 2023.07.29 |
[백준 1427] 소트인사이드 (JAVA) (0) | 2023.07.29 |
[백준 1377] 버블 소트 (JAVA) (0) | 2023.07.10 |