반응형
이 포스트에서는 프로그래밍 문제 사이트 백준 Online Judge(BOJ)의 17371번 : '이사' 문제의 풀이 코드와 해설을 다루고 있습니다.
문제 난이도는 Solved.ac 기준 Gold I에 해당하며, 문제를 풀이하기 위해 그리디 알고리즘과 기하학에 대한 기초적인 이해가 필요합니다.
17371번 : 이사
N개의 편의시설에 대한 좌표가 주어졌을 때, 가장 가까운 편의시설과 가장 먼 편의시설까지의 거리의 평균이 최소가 되는 좌표를 구하는 문제입니다.
가능한 좌표가 여러 가지일 수 있으므로, 그들 중 하나의 답을 출력하면 정답으로 인정될 수 있습니다.
이해를 돕기 위해 간단히 그림을 그려 설명해보면, 여러 개의 편의시설 중 가장 먼 편의시설의 거리가 최소인 편의시설의 위치를 집의 위치로 잡으면, 가장 가까운 거리가 자동적으로 0이 되고 가장 먼 거리는 아까 최소로 잡았다고 했으므로 정답 중 하나인 위치가 됩니다.
따라서 O(N^2)으로 모든 집의 위치 관계를 비교해보면서 답을 얻어내면 됩니다.
#include <bits/stdc++.h>
using namespace std;
struct Point { int x, y; };
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N; cin >> N;
vector<Point> point(N);
for(int i=0; i<N; i++)
cin >> point[i].x >> point[i].y;
int ans, minDist = INT_MAX;
for(int i=0; i<N; i++) {
double maxDist = 0;
for(int j=0; j<N; j++) {
double dist = sqrt(pow(point[i].x - point[j].x, 2) + pow(point[i].y - point[j].y, 2));
maxDist = max(maxDist, dist);
}
if(maxDist < minDist) {
minDist = maxDist;
ans = i;
}
}
cout << point[ans].x << " " << point[ans].y << "\n";
}
위의 그림을 풀이 코드로 나타내면 위와 같이 작성해볼 수 있습니다.
pair나 배열을 쓸까 고민했는데 코드의 가독성을 위해 Point 구조체를 사용하였습니다.
풀이 코드를 제출하면 위와 같은 기록으로 정답 처리를 받을 수 있습니다.
반응형
'알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준/BOJ] 2981번 : 검문, 3036번 : 링 (정수론, 조합론) (0) | 2022.02.25 |
---|---|
[백준/BOJ] 1019번 : 책 페이지 (수학, Counting) (+ Class 6 획득) (2) | 2022.02.24 |
[백준/BOJ] 16565번 : N포커 (DP, 조합론, 포함과 배제의 원리) (0) | 2022.02.23 |
[백준/BOJ] 5052번 : 전화번호 목록 (트라이, Trie) (0) | 2022.02.23 |
[백준/BOJ] 13977번 : 이항 계수와 쿼리 (페르마의 소정리) (0) | 2022.02.22 |