๐ ๋งํฌ
https://www.acmicpc.net/problem/14746
๐คฏ ํ์ค ํ๊ธฐ
์์์จ์ ์ด๋ ค์ ๋ณด์ด๊ฒ ํ๊ธฐ
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
ICPC ์์ ๋๋น ํ ์คํฐ๋๋ฅผ ์์ํ๋ค.
2017 ๋์ ์ธํฐ๋ท ์์ A๋ฒ ๋ฌธ์ ์ธ Closest Pair. ์ฒ์์ ๊ดํ ์ ๋ฐ ์์ ๋๋ฌธ์ ์ฝ๊ธฐ ์ด๋ ค์๋ณด์๋๋ฐ ์ฌ์ค ์๊ณ ๋ณด๋ฉด ๊ฐ๋จํ ๋ฌธ์ ์ด๋ค.
์ต๊ทผ์ ์์ ๊ฑฐ๋ฆฌ (์ฌ๊ธฐ์ ๋งํ๋ ๊ฑฐ๋ฆฌ d = | x1 - x2 | + | y1 - y2 |)๋ฅผ ๊ตฌํ๊ณ , ํด๋น ๊ฑฐ๋ฆฌ์ธ ์ต๊ทผ์ ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
c1, c2๋ ๊ฐ๊ฐ x์ ์ขํ์ ์งํฉ p, q์ y์ขํ์ด๋ค.
์ด์ ๋ฌธ์ ์์ ์ด๋ฏธ ์๊ณ ์๋ ๋ถ๋ถ๋ค์ ๋นผ๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผํ๋ ๋ถ๋ถ์ด ์์ ์ง๋ค.
์ต๊ทผ์ ์์ ๊ฑฐ๋ฆฌ์ค ์ต์์ธ min_distance๋ฅผ ํ์ด๋ณด์.
min_distance = min(d(p', q')) = min(| x1 - x2 | + | c1 - c2 |) -> x1 ์ ์งํฉ p์ ์์, x2๋ ์งํฉ q์ ์์
c1, c2๋ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ์ ์ด๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก min(| x1 - x2 |) ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก ๋ฐ๋๊ฒ ๋๋ค.
์งํฉ p, q๋ ๊ฐ๊ฐ ์ต๋ 50๋ง์ด๋ค. ๋น์ฐํ O(n^2)์ผ๋ก ์์ ํ์์ ํ ์๋ ์๋ค.
๋จธ๋ฆฌ๋ฅผ ๊ตด๋ ค์ ์๊ฐ์ ์ค์ฌ๋ณด์. ์งํฉ p์ ์์ ์ค ํ๋์ธ x๊ฐ ์์ ๋, x - x2 ๊ฐ ๊ฐ์ฅ ์์์ง๋ ค๋ฉด x2์๋ ์ด๋ค ์๊ฐ ์์ผํ ๊น?
x2๋ x์ ๊ฐ์ฅ ์ฐจ์ด๊ฐ ์๋ ํน์ ๊ฐ์ ์ซ์๊ฐ ์์ผํ๋ค.
์ฐ๋ฆฌ๋ ์์ฃผ ๋น ๋ฅด๊ฒ ์งํฉ q์์ x์ ๊ฐ์ฅ ๊ทผ์ํ ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ์ขํ์ ์์น๋ฅผ ์์๋ผ ์ ์๋ค. ์ด๋ถํ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
c++์๋ ์์ฃผ ์น์ ํ upper_bound, lower_bound๋ก ์์น๋ฅผ ์๋ ค์ค๋ค.
์งํฉ q๋ฅผ ์ ๋ ฌํ ํ, ์งํฉ p๋ฅผ ์ฐจ๋ก๋๋ก ๋๋ฉด์ upper_bound ๋ฅผ ํตํด p[i]๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์งํฉ q์ ์์๋ฅผ ์ฐพ์๋ธ๋ค.
์ฐพ์ ํ ํด๋น ์ขํ๋ณด๋ค ํ๋ ๋ ์์ ์์๊น์ง ๋น๊ตํ์ฌ ํ์ฌ p[i] - q[index] ๊ฐ ๋ ์์์ง๋ฉด ๊ฐ์๋ฅผ ์ธ๋ ์์ผ๋ก ๊ตฌํํ๋ค.
์ฝ๊ฐ์ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ฐ upper_bound ์ธ๋ฑ์ค๊ฐ 0, size-1์ผ ๋ ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ณ , q์ ์์์ ๊ฐ์๊ฐ 1๊ฐ์ผ ๋๋ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
์ด ๋ถ๋ถ๋ง ์ ์ํ๋ฉด AC๋ฅผ ๋ฐ์ ์ ์๋ค.
๐ป ์ฝ๋
//AC
//BOJ 14746 Closest Pair
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define INF 1e9
vector<int> p;
vector<int> q;
int main() {
int n, m, c1, c2, num;
scanf("%d %d", &n, &m);
scanf("%d %d", &c1, &c2);
for(int i=0; i<n; i++) {
scanf("%d", &num);
p.push_back(num);
}
for(int i=0; i<m; i++) {
scanf("%d", &num);
q.push_back(num);
}
sort(q.begin(), q.end());
int min_value = INF, cnt = 0, lower_value, upper_value;
for(int i=0; i<n; i++){
int value = p[i];
int idx = upper_bound(q.begin(), q.end(), value) - q.begin();
if(idx >= m) {
idx -= 1;
}
upper_value = q[idx];
if(m == 1) {
if(abs(value - upper_value) < min_value) {
cnt = 1;
min_value = abs(value - upper_value);
}
else if(abs(value - upper_value) == min_value) cnt += 1;
continue;
}
if(idx == 0) lower_value = q[idx+1];
else lower_value = q[idx - 1];
int upsum_value = abs(value - upper_value);
int losum_value = abs(value - lower_value);
if(upsum_value == losum_value) {
if(upsum_value == min_value) {
cnt += 2;
}
else if (upsum_value < min_value) {
min_value = upsum_value;
cnt = 2;
}
}
else {
int min_sum_value = min(upsum_value, losum_value);
if(min_sum_value == min_value) {
cnt += 1;
}
else if(min_sum_value < min_value) {
min_value = min_sum_value;
cnt = 1;
}
}
}
int ans = abs(c1 - c2) + min_value;
printf("%d %d", ans, cnt);
return 0;
}
'DEV > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/11968] High Card Wins, c++ (0) | 2021.12.22 |
---|---|
[BOJ/20208] ์ง์ฐ์ ๋ฏผํธ์ด์ฝ ์ฐ์ , c++ (0) | 2021.09.20 |
[BOJ/20218] Parity Constraint Shortest Path, c++ (1) | 2021.08.28 |
[BOJ/20666] ์ธ๋ฌผ์ด์ ์ ์, c++ (2) | 2021.08.20 |
[BOJ/20665] ๋ ์์ค ๊ฑฐ๋ฆฌ๋๊ธฐ, c++ (2) | 2021.08.20 |