백준 2587 대표값2 Java 풀이: 평균과 중앙값 구하기

반응형

백준 2587번 ‘대표값2’는 다섯 수의 평균과 중앙값을 출력하는 구현 문제다. 평균은 합을 5로 나누고, 중앙값은 배열을 정렬한 뒤 가운데 인덱스인 2의 값을 선택하면 된다.

풀이 순서

  1. 정수 5개를 배열에 저장하면서 합을 구한다.
  2. Arrays.sort()로 배열을 오름차순 정렬한다.
  3. sum / 5를 평균으로 출력한다.
  4. 정렬된 배열의 numbers[2]를 중앙값으로 출력한다.

입력 개수가 홀수인 5개로 고정되어 있으므로 정렬 후 세 번째 수가 중앙값이다. 이 문제의 입력 조건에서는 평균이 자연수가 되므로 정수 나눗셈으로 출력할 수 있다.

Java 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int[] numbers = new int[5];
        int sum = 0;

        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = Integer.parseInt(br.readLine());
            sum += numbers[i];
        }

        Arrays.sort(numbers);

        int average = sum / numbers.length;
        int median = numbers[numbers.length / 2];

        System.out.println(average);
        System.out.println(median);
    }
}

예제로 확인하기

입력이 다음과 같다고 하자.

10
40
30
60
30

합은 170이므로 평균은 34다. 정렬한 배열은 [10, 30, 30, 40, 60]이고, 가운데 값은 30이다.

34
30

처음 틀렸던 이유

문제 자체는 금방 풀 수 있었지만 제출 과정에서 두 번 헤맸다. 먼저 IntelliJ에서 Control + R을 눌러 이전에 실행했던 소스를 다시 돌리고도 현재 코드가 실행됐다고 생각했다. 그다음에는 Arrays.sort(numbers)를 빠뜨려 54%에서 오답이 났다.

평균은 입력 순서와 무관하지만 중앙값은 정렬된 순서를 기준으로 한다. 배열의 세 번째 입력값을 그대로 출력하면 중앙값이라는 보장이 없다. 짧은 구현 문제일수록 실행 대상과 전처리 한 줄을 체크해야 한다는 기록으로 남겨 둔다.

복잡도

일반적으로 원소가 N개라면 정렬에 O(N log N) 시간이 들고 배열에 O(N) 공간을 사용한다. 이 문제는 N = 5로 고정되어 있어 실행 비용은 사실상 상수다.

자주 헷갈리는 점

평균만 구할 때도 정렬해야 할까?

평균은 합만 있으면 되므로 정렬할 필요가 없다. 정렬은 중앙값을 찾기 위해 사용한다.

중앙값 인덱스는 왜 2일까?

Java 배열 인덱스는 0부터 시작한다. 원소 5개의 인덱스는 0, 1, 2, 3, 4이므로 가운데는 2다. 코드에서는 numbers.length / 2로 표현해 의미를 드러냈다.

반응형
KEEP READING
카테고리 전체 보기 →

댓글