Koder / 박성훈
article thumbnail

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

 

2548번: 대표 자연수

첫째 줄에는 자연수의 개수 N이 입력된다. N은 1 이상 20,000 이하이다. 둘째 줄에는 N개의 자연수가 빈칸을 사이에 두고 입력되며, 이 수들은 모두 1 이상 10,000 이하이다.

www.acmicpc.net

두번속은문제....

 

1. 지문읽으면서 엥 이거 평균아닌가 라고 생각 >> 지문에서반박당함

2. 이분탐색 생각해봄 >> 무한반복 걸려서 고민하던중 다른 아이디어 발견

 

이 문제에서 요구하고 있는 값은 입력된 배열의 중앙값이다.

입력된 배열에서

대표 자연수를 $K$ 라고 할때,

 

대표 자연수보다 큰 수가 $A$개 있고

대표 자연수보다 작은 수가 $B$ 개 있을 것이다.

(이때, $A+B == N$ 이다)

 

대표 자연수 $K$를 1 크게 하면

$A$개의 수와의 차의 절댓값이 1만큼 줄어들어 합 $SUM$이 $A$만큼 줄어들것이고

$B$개의 수와의 차의 절댓값이 1만큼 늘어 합 $SUM$이 $B$만큼 증가할것이다.

 

또한, $K$를 1 작게 하면

$SUM$은 $A$만큼 증가하고 $B$만큼 줄어들것이다.

 

$SUM$을 최소로 정하려면 $A$와 $B$가 같아져서 증가하고 줄어드는 변화가 0에 가까워져야 하고,

$A$ 와 $B$가 같다는 말은 $K$보다 큰 수와 작은 수의 갯수가 같다는 말이므로

정렬된 배열에서 중간에 있는 값에 해당한다.

 

배열의 크기가 짝수일때는 지문에서 요구하는대로 작성해주면 된다.

 

#include<bits/stdc++.h>
using namespace std;

int N;
int arr[23456];

int main(){
	cin.sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	cin >> N;
	for(int i=0; i<N; i++){
		cin >> arr[i];
	}
	
	sort(arr, arr+N);
	
	int idx;
	if(N%2) idx = N/2;
	else idx = N/2-1;
	
	cout << arr[idx];
	return 0;
}

반응형