- 문제 : https://www.acmicpc.net/problem/2405
문제 이해
- 주어진 수들 중에서 세 개의 숫자를 구해 거기서 3 * (중위값 - 평균)의 최대값을 구한다.
직관적으로 이해하기로는 중위값과 평균의 차이가 커야하므로 중위값은 최솟값과 비슷한 숫자여야하고 평균이 커야 하므로 배열의 최댓값이 무조건 들어가야 한다고 생각했다. 따라서 (0, 1, -1) 또는 (0, -2, -1) 두 개의 집단만 비교하면 된다고 생각해 진행했는데 21%에서 틀렸다.
강의를 들어보니 중위값은 배열 전체의 값이 후보가 될 수 있고, 중위값을 기준으로 (중위값 - 최소 평균)과 (중위값 - 최대 평균) 중 최대값들을 누적해 가는 거라고 했다. 고려해야하는 케이스가 두 가지인 이유는 두 값의 절댓값을 계산하기 때문이다. 절댓값은 결국 두 값의 수직선 상에서의 거리이므로 중위값에서 최소의 값을 빼는 게 클 수도 또는 최대 평균에서 중위값을 빼는 게 클 수도 있다.
풀이 로직
- 숫자들을 numbers에 저장한 뒤 오름차순 정렬한다.
- numbers의 원소들을 선형 탐색하면서 i번째 원소를 중위값으로 설정한 뒤 max_avg, min_avg를 구한다.
- max_avg를 구하는 방법은 i번째 원소보다 작은 원소 중에 가장 큰 (i - 1) 원소와 배열 최대값인 (-1) 원소를 합해서 3으로 나누면 된다.
- min_avg를 구하는 방법은 i번째 원소보다 큰 원소중에 가장 작은 (i + 1) 원소와 배열 최소값인 (0) 원소를 합해서 3으로 나누면 된다.
- 각 중위값에서 최대값을 answer에 누적했다가 또 거기에서 최대값을 출력하면 정답이다.
정답 풀이
import sys
input = sys.stdin.readline
n = int(input())
numbers = []
for _ in range(n):
numbers.append(int(input()))
answer = []
numbers.sort()
for i in range(1, n - 1):
median = numbers[i]
max_avg = numbers[i - 1] + median + numbers[-1]
min_avg = numbers[0] + median + numbers[i + 1]
answer.append(max(abs(max_avg - 3 * median), abs(min_avg - 3 * median)))
print(max(answer))
'백준 > Greedy' 카테고리의 다른 글
[heap/백준] 1417번 : 국회의원 선거 (0) | 2023.07.18 |
---|---|
[그리디/백준] 14247번 : 나무 자르기 (0) | 2023.05.08 |
[그리디/백준] 2812번 : 크게 만들기 (0) | 2022.07.17 |
[그리디/백준] 10775번: 공항, union-find 공부 (0) | 2022.07.17 |
[그리디/백준] 8980번: 택배(다시) (0) | 2022.07.16 |