기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준 1007번 _ 벡터 매칭 본문

백준(Python)/브루트포스 알고리즘(완전탐색)

[코딩 테스트 연습(파이썬/Python)] 백준 1007번 _ 벡터 매칭

mingchin 2022. 3. 4. 19:30
728x90
반응형

https://www.acmicpc.net/problem/1007

 

1007번: 벡터 매칭

평면 상에 N개의 점이 찍혀있고, 그 점을 집합 P라고 하자. 집합 P의 벡터 매칭은 벡터의 집합인데, 모든 벡터는 집합 P의 한 점에서 시작해서, 또 다른 점에서 끝나는 벡터의 집합이다. 또, P에 속

www.acmicpc.net

[문제]

평면 상에 N개의 점이 찍혀있고, 그 점을 집합 P라고 하자. 집합 P의 벡터 매칭은 벡터의 집합인데, 모든 벡터는 집합 P의 한 점에서 시작해서, 또 다른 점에서 끝나는 벡터의 집합이다. 또, P에 속하는 모든 점은 한 번씩 쓰여야 한다.

벡터 매칭에 있는 벡터의 개수는 P에 있는 점의 절반이다.

평면 상의 점이 주어졌을 때, 집합 P의 벡터 매칭에 있는 벡터의 합의 길이의 최솟값을 출력하는 프로그램을 작성하시오.

 

[입력]

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 구성되어있다.

테스트 케이스의 첫째 줄에 점의 개수 N이 주어진다. N은 짝수이다. 둘째 줄부터 N개의 줄에 점의 좌표가 주어진다. N은 20보다 작거나 같은 자연수이고, 좌표는 절댓값이 100,000보다 작거나 같은 정수다. 모든 점은 서로 다르다.

[출력]

각 테스트 케이스마다 정답을 출력한다. 절대/상대 오차는 10-6까지 허용한다.

 

[아이디어]

1) 주어진 점의 개수가 2N개라면, 각 N개의 점들의 좌표의 합 두 쌍이 최종적인 합 벡터의 두 점을 구성한다고 생각할 수 있다.

2) 어떤 점들의 조합이 최소를 만들어낼 수 있는지에는 규칙이 없으므로, 모든 케이스를 탐색해야한다.

3) 2N개의 점 중 N개의 합만 구할 수 있다면, 나머지 N개의 합은 총합에서 이전 N개의 합을 뺀 것과 같다.

4) 결과적으로 두 점 사이의 거리를 구하는 것과 같다.

 

from itertools import combinations as c
import math
import sys
input=sys.stdin.readline

t = int(input())
for _ in range(t):
    x=0; y=0;
    n = int(input())
    d = []
    ans = int(1e10)
    tmp = list(c(range(n),n//2))[:math.comb(n,n//2)//2]
    for _ in range(n):
        a,b = map(int,input().split())
        d.append((a,b))
        x+=a; y+=b
    for p in tmp:
        x_ = x
        y_ = y
        for q in p:
            nx, ny = d[q]
            x_ -= 2*nx
            y_ -= 2*ny
        ans = min(ans,math.sqrt(x_**2+y_**2))
    print(ans)
728x90
반응형