본문 바로가기

알고리즘/백준

[백준 알고리즘 자바] 25305 : 커트라인

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

 

25305번: 커트라인

시험 응시자들 가운데 1등은 100점, 2등은 98점, 3등은 93점이다. 2등까지 상을 받으므로 커트라인은 98점이다.

www.acmicpc.net


문제

  • 2022 연세대학교 미래캠퍼스 슬기로운 코딩생활에 N명의 학생들이 응시했다.
  • 이들 중 점수가 가장 높은 k명은 상을 받을 것이다. 이 때, 상을 받는 커트라인이 몇 점인지 구하라.
  • 커트라인이란 상을 받는 사람들 중 점수가 가장 가장 낮은 사람의 점수를 말한다.

입력

  • 첫째 줄에는 응시자의 수 N과 상을 받는 사람의 수 k가 공백을 사이에 두고 주어진다.
  • 둘째 줄에는 각 학생의 점수 x가 공백을 사이에 두고 주어진다.

출력

  • 상을 받는 커트라인을 출력하라.

입출력 예제


풀이방식

이번 문제는 정렬을 사용하여 푸는 문제이다.


설계과정

1. 입력받은 배열을 내림차순으로 정렬한다.

2. 평균을 구하는 함수를 작성한다.

3. 배열의 인덱스 값을 사용해서 중간값을 구하는 함수를 작성한다.

4. 구한 값들을 출력한다.


풀이과정

1. 값을 입력받는 코드를 작성한다.

 

2. 배열을 내림차순으로 정렬한다.

  • Arrays.sort() : 배열을 자동으로 오름차순으로 정렬해준다.
  • Collections.reverseOrder() : Arrays.sort() 안에 사용하며 배열을 내림차순으로 정렬해준다.

3. K-1번째 배열의 값을 출력한다.

  • 번호는 1부터 시작하므로 1을 빼줘야 2번째 인덱스 값을 가져올 수 있다.
  • 이는 앞서 배열을 내림차순으로 정렬했기에 가능한 작업이다.
  • 점수가 큰 순서대로 정렬되었으므로 K번째 값이 K번째로 상을 받는 점수이다.
  • 이 경우에는 함수에 특별한 계산 과정이 없으므로 main 에서 바로 출력해도 된다.
  • 필자는 함수를 분리하는 코딩에 익숙해지고자 해당 방식으로 구현했다.

답안소스

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class Main {

	public static int cut(int N, int K, Integer[] arr) {
		int result = 0;
		
		result = arr[K-1];
		
		return result;
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int K = sc.nextInt();
		Integer[] arr = new Integer[N];
		
		for(int i=0; i<N; i++) {
			arr[i] = sc.nextInt();
		}
        
		Arrays.sort(arr, Collections.reverseOrder());
		
		System.out.println(Main.cut(N, K, arr));
	}
}