백준 2587번 ‘대표값2’는 다섯 수의 평균과 중앙값을 출력하는 구현 문제다. 평균은 합을 5로 나누고, 중앙값은 배열을 정렬한 뒤 가운데 인덱스인 2의 값을 선택하면 된다.
풀이 순서
- 정수 5개를 배열에 저장하면서 합을 구한다.
Arrays.sort()로 배열을 오름차순 정렬한다.sum / 5를 평균으로 출력한다.- 정렬된 배열의
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로 표현해 의미를 드러냈다.
'배움과 성장 > 알고리즘·문제풀이' 카테고리의 다른 글
| 백준 25501 재귀의 귀재 Java: 팰린드롬 결과와 호출 횟수 세기 (0) | 2022.11.26 |
|---|---|
| 백준 25305 커트라인 Java: primitive 배열 정렬 오류를 바로잡은 풀이 (0) | 2022.11.25 |
| 백준 2566 최댓값 Java: 9×9 입력에서 행과 열 찾기 (0) | 2022.11.22 |
| 백준 11779 최소비용 구하기 2 Java: 다익스트라 경로 복원 (0) | 2022.07.21 |
| 백준 1916 최소비용 구하기 Java: PriorityQueue 다익스트라 (0) | 2022.07.15 |
댓글