Algorithm/수학

BOJ#1007 Vector Matching

밤이2209 2016. 11. 4. 16:41

* 문제

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