728x90
문제 링크
문제 설명
영선이는 이번에 편의점으로 창업을 하려고 계획 중이다. 이번 창업을 위해 많은 준비를 하고 있는데, 아직 편의점을 세울 위치를 결정을 하지 못했다. 영선이는 미리 시장조사를 하여, 주요 고객들이 어느 위치에 존재하는지 파악을 하였고, 모든 고객들의 거리의 합을 최소로 하려한다. 두 위치의 거리는 |x1-x2|+|y1-y2|로 정의한다.
n명의 주요 고객들의 위치 (xi,yi)이 주어질 때, 모든 고객들의 거리 합을 최소로 하는 위치에 편의점을 세울 때, 그 최소 거리 합을 출력하시오.
입력
첫째 줄에는 주요 고객들의 수n이 주어진다.(1≤n≤100,000)
다음 n줄에는 고객들의 위치 (x,y)가 주어진다.(-1,000,000≤x,y≤1,000,000)
출력
모든 고객들의 거리 합을 최소로 하는 위치에 편의점을 세울 때, 그 최소 거리 합을 출력하시오.
구조화
x의 최적 구하고, y의 최적 구해서, 고객들의 위치와 거리 합 출력
x, y 최적을 구할때는 참고: BOJ 18310 안테나(JAVA)
오답 노트
입력 조건을 잘보고 sum 예측해서 타입 설정해주기!
int가 아니라 long이다!
소스 코드
import java.io.*;
import java.util.*;
public class Main {
public static int n, x, y;
public static int[][] customer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
customer = new int[n][2];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
customer[i][0] = Integer.parseInt(st.nextToken());
customer[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(customer, (o1, o2)->o1[0]-o2[0]);
if (n%2==0){
x = customer[n/2-1][0];
}
else {
x = customer[n/2][0];
}
Arrays.sort(customer, (o1, o2)->o1[1]-o2[1]);
if (n%2==0){
y = customer[n/2-1][1];
}
else {
y = customer[n/2][1];
}
long ans = 0;
for (int i = 0; i < n; i++) {
ans += Math.abs(x-customer[i][0]) + Math.abs(y-customer[i][1]);
}
System.out.println(ans);
}
}
git 링크
'Algorithm > 백준' 카테고리의 다른 글
BOJ 28278 스택 2 🗑 (0) | 2024.04.12 |
---|---|
BOJ 1205 등수 구하기(JAVA) 🥇 (0) | 2024.04.11 |
BOJ 18310 안테나(JAVA) 📡 (0) | 2023.12.29 |
BOJ 18223 민준이와 마산 그리고 건우(JAVA) 🚍 (0) | 2023.12.29 |
BOJ 2665 미로만들기(JAVA) ❔ (1) | 2023.12.26 |