* 문제
https://www.acmicpc.net/problem/1007
* 풀이
평면 상에 N개의 점이 찍혀있다. (N은 짝수)
N개의 점을 이용해서 벡터를 만든다.
벡터는 당연히 N/2개 나올 것이다.
문제를 자세히 보니, N개 점들의 좌표가 주어지고 평면벡터이다.
평면 상에 2개의 점 A(x1, y1), B(x2, y2), C(x3, y3), D(x4, y4)가 주어졌고
임의의 벡터를 구성했다고 가정해보자.
2개의 임의의 벡터이다.
AB = (x1-x2, y1-y2)
CD = (x3-x4, y3-y4)
위 2개의 벡터의 합은 아래와 같다.
AD+CD = (x1+x3-(x2+x4), y1+y3-(y2+y4))
위 벡터의 크기는
Math.sqrt((x1+x3-(x2+x4))^2, (y1+y3-(y2+y4))^2)
∴ 문제의 목표는 위 값의 최소값을 구하는 것이다.
결국 N개의 점에서 N/2개의 점을 뽑아야 한다.
왜냐하면 N/2개의 점은 +값을 갖고, 나머지 N/2개의 점은 -값을 갖기 때문이다.
따라서 N개의 점에서 N/2개의 점을 뽑는 모든 경우의 수에서 min값을 계속 갱신해야 한다.
이것을 풀기 위해 조합(Combination)을 이용해보자.
- 조합의 구현은 아래 링크를 참조해 봅시다.
- http://stack07142.tistory.com/25
각각의 경우가 추출될 때마다 벡터의 크기를 계산하여 계속 최소값을 갱신하면 된다.
* 나의 코드
https://github.com/stack07142/BOJ/tree/master/BOJ%231007_VectorMatching
'Algorithm > 수학' 카테고리의 다른 글
BOJ#4134 다음 소수 (0) | 2016.11.09 |
---|---|
BOJ#1929 소수 구하기 (0) | 2016.11.08 |
BOJ#2609 최대공약수 최소공배수 (0) | 2016.11.08 |
BOJ#1004_어린 왕자 (0) | 2016.11.04 |
BOJ#1002_터렛 (0) | 2016.11.04 |