[C++] 2141번: 우체국

2023. 8. 6. 03:29·[게임 개발] 알고리즘 공부/백준

링크

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

 

2141번: 우체국

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 X[1], A[1], X[2], A[2], …, X[N], A[N]이 주어진다. 범위는 |X[i]| ≤ 1,000,000,000, 1 ≤ A[i] ≤ 1,000,000,000 이며 모든 입력은 정수이다.

www.acmicpc.net

문제

수직선과 같은 일직선상에 N개의 마을이 위치해 있다. i번째 마을은 X[i]에 위치해 있으며, A[i]명의 사람이 살고 있다.

이 마을들을 위해서 우체국을 하나 세우려고 하는데, 그 위치를 어느 곳으로 할지를 현재 고민 중이다. 고민 끝에 나라에서는 각 사람들까지의 거리의 합이 최소가 되는 위치에 우체국을 세우기로 결정하였다. 우체국을 세울 위치를 구하는 프로그램을 작성하시오.

각 마을까지의 거리의 합이 아니라, 각 사람까지의 거리의 합임에 유의한다

입출력 예제

입력

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 X[1], A[1], X[2], A[2], …, X[N], A[N]이 주어진다. 범위는 |X[i]| ≤ 1,000,000,000, 1 ≤ A[i] ≤ 1,000,000,000 이며 모든 입력은 정수이다.

출력

첫째 줄에 우체국의 위치를 출력한다. 가능한 경우가 여러 가지인 경우에는 더 작은 위치를 출력하도록 한다.

예제 입력 1 복사
3
1 3
2 5
3 3
예제 출력 1 복사
2

코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
#include <queue>
#include <stack>

using namespace std;

int main(void)
{
	cin.tie(NULL);
	cout.tie(NULL);
	ios_base::sync_with_stdio(false);

	vector<pair<long long, long long>> vil;
	long long sum = 0;
	int n; 
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		long long temp_1;
		long long temp_2;
		cin >> temp_1 >> temp_2;
		vil.push_back({ temp_1, temp_2 });
		sum += temp_2;
	}
	sort(vil.begin(), vil.end());

	long long current = 0;
	for (int i = 0; i < n; i++)
	{
		current += vil[i].second;
		if (current >= (sum + 1) / 2)
		{
			cout << vil[i].first;
			return 0;
		}
	}
	return 0;
}

풀이

  • 그리디 알고리즘으로 풀었다.

  • 마을 번호 입력이 순서대로 들어오는것이 아니다.
    따라서 정렬 없이 진행 시 마을 순서가 뒤죽박죽이 되므로 sort를 이용해 정렬 해 준다.
  • 모든 마을의 총 인원의 절반(홀수의 경우 +1)을 구하고, 마을별로 차례대로 인원을 더해
    앞서 구한 인원을 넘어서게 되면 해당 마을이 거리합이 최소가 되는 마을이다.
저작자표시 (새창열림)

'[게임 개발] 알고리즘 공부 > 백준' 카테고리의 다른 글

[C++] 1051번: 숫자 정사각형  (0) 2023.08.08
[C++] 13975번: 파일 합치기 3  (0) 2023.08.07
[C++] 1715번: 카드 정렬하기  (0) 2023.08.02
[C++] 12904번: A와 B  (0) 2023.07.31
[C++] 1374번: 강의실  (0) 2023.07.27
'[게임 개발] 알고리즘 공부/백준' 카테고리의 다른 글
  • [C++] 1051번: 숫자 정사각형
  • [C++] 13975번: 파일 합치기 3
  • [C++] 1715번: 카드 정렬하기
  • [C++] 12904번: A와 B
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (123)
      • 🎵 일상 (2)
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (12)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
      • [게임 개발] CS 공부 (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      그리디
      dp
      스레드
      누적합
      dfs
      참조자
      투포인터
      브루트포스
      슬라이딩 윈도우
      우선순위 큐
      context switching
      역참조
      데드락
      문자열
      해시
      메모리구조
      프로세스
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    [C++] 2141번: 우체국
    상단으로

    티스토리툴바