PS/그리디 알고리즘[Greedy]

백준 18310 안테나

SeungbeomKim 2022. 6. 30. 22:57

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

 

18310번: 안테나

첫째 줄에 집의 수 N이 자연수로 주어진다. (1≤N≤200,000) 둘째 줄에 N채의 집에 위치가 공백을 기준으로 구분되어 1이상 100,000이하의 자연수로 주어진다.

www.acmicpc.net

<틀린 코드>

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <utility>
using namespace std;
bool com(pair<long long, long long> a, pair<long long, long long> b) {
	if(a.second==b.second){
		return a.first < b.first;
	}
	return a.second < b.second;
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n;
	cin>>n;
	vector<long long>v;
	vector<pair<long long,long long>>p;
	while(n--)
	{
		int a;
		cin>>a;
		v.push_back(a);
	}
	int end = *max_element(v.begin(),v.end());
	int result;
	for(int i = end; i>=1;i--)
	{
		long long sum = 0;
		for(int j=0;j<v.size();j++){
			
			sum += abs(i-v[j]);		
		}
		p.push_back(make_pair(i,sum));
	}
	sort(p.begin(),p.end(),com);
	cout<<p[0].first<<'\n';
	
}

처음에는 가장 큰 값을 기준으로 1씩 감소시켜 벡터의 각 원소들을 빼준 다음, 벡터 pair에 index와 값을 저장한 후 두 번째 원소값을 기준으로 가장 작은 인덱스를 반환하려고 했지만,, 시간 초과가 떴다.. 

<맞는 코드>

#include <iostream>
#include <algorithm>

using namespace std;
 
int N;
int arr[200001];
int ans;

int main(){

	ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> arr[i];
	sort(arr, arr + N);
	ans = arr[(N - 1) / 2];
	cout << ans << '\n';

	return 0;
}

 그냥 정렬시켜서 중앙값을 찾으면 해당 인덱스가 거리의 합이 최소가 되는 시점이다..

구글링을 했지만, 정말 대단한 사람이 많은 것 같다

'PS > 그리디 알고리즘[Greedy]' 카테고리의 다른 글

백준 19941 햄버거 분배  (0) 2022.07.03
백준 1449 수리공 항승  (0) 2022.07.01
백준 2812 크게 만들기  (0) 2022.06.30
백준 2012 등수매기기  (0) 2022.06.30
백준 9009 피보나치  (0) 2022.06.29