📖 문제
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
💡 풀이 방식
• 정렬 + 그리디 + 중간값
우체국 위치와, 마을 거주 인원을 저장하는 마을 객체를 만든다.마을 객체 배열에 값을 입력받고, 모든 마을의 인원 수를 저장한다.
입력받은 마을 객체 배열을 정렬한다.
- 서로 거리가 같은 경우, 마을 인원 수 기준 오름차순 정렬
- 서로 거리가 다르다면, 거리 기준 오름차순 정렬
그리고 완전탐색을 통해 하나씩 인구 수를 계산하며 중간값과 가장 근접한 마을 찾아 출력한다.
long sum = 0;
for(Node now : arr) {
sum += now.a;
if(sum >= (result + 1) / 2) { // 중간값과 비교
System.out.println(String.valueOf(now.x));
break;
}
}
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static Node[] arr;
static long result = 0; // 총 인원
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine()); // 마을 수
arr = new Node[N];
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine(), " ");
long X = Long.parseLong(st.nextToken());
long A = Long.parseLong(st.nextToken());
arr[i] = new Node(X, A);
result += A; // 총 인원 구하기
}
Arrays.sort(arr); // 마을 위치 기준 오름차순 정렬
long sum = 0;
// 하나씩 인구 수 계산해 "중간값과 가장 근접한 마을" 찾아 출력하기
for(Node now : arr) {
sum += now.a;
if(sum >= (result + 1) / 2) { // 중간값 : (result + 1) / 2
System.out.println(String.valueOf(now.x));
break;
}
}
}
}
class Node implements Comparable<Node> {
long x, a;
public Node(long x, long a) {
this.x = x;
this.a = a;
}
@Override
public int compareTo(Node n) {
// 서로 거리가 같은 경우, 마을 인원 수 기준 오름차순 정렬
if(this.x == n.x)
return (int)(this.a - n.a);
return (int)(this.x - n.x); // 서로 거리가 다르다면, 거리 기준 오름차순 정렬
}
}
|
cs |
➕ 다른 풀이 방식
이분 탐색을 활용한 풀이!
[Java] 백준 2141번 우체국
그리디, 이분탐색으로 문제를 해결할 수 있습니다. 각 마을 중에 한곳에 우체국을 세울 때 각 사람들과 우체국의 거리의 합을 가장 적게 할 수 있는 위치를 찾아야 합니다. 1. 마을 인덱스를 기준
j3sung.tistory.com
💦 어려웠던 점
- 거주 인원 기준 정렬하고, 사람이 가장 많이 사는 마을에 설치하려고 했었다.
- 중간값이 정답이겠단 생각은 했는데 이걸 구하는 아이디어를 생각하지 못 했다.
🧐 새로 알게 된 내용
- 정렬하고 나서 완전탐색을 통해 앞에 있는 값부터 순차적으로 인구 수를 더해가면서 중간값과 가장 근접한 마을을 찾아 출력하는 아이디어
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[JAVA]백준_2141_우체국
문제링크 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, 0≤A[i]≤1,000,000,000
dang2dangdang2.tistory.com
[백준, Java] 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 이며 모든 입력
tussle.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 8980번: 택배 (0) | 2024.04.22 |
---|---|
[백준/JAVA] 14497번: 주난의 난(難) (0) | 2024.04.21 |
[백준/JAVA] 1987번: 알파벳 (0) | 2024.04.18 |
[백준/JAVA] 1455번: 뒤집기 II (0) | 2024.04.17 |
[백준/JAVA] 10711번: 모래성 (0) | 2024.04.15 |