본문 바로가기
문제 해결/BOJ

[백준] 벡터 매칭

by 자잘 2023. 3. 25.

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

 

1007번: 벡터 매칭

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

www.acmicpc.net

한참의 고민 끝에 풀은 문제입니다. 벡터라는 말에 너무 쫄았던 것 같습니다. 벡터를 만들기 위해서 2가지를 선택하여 한쪽에서 나머지를 빼준 다음 만들어진 벡터의 합을 구하기 위해 x, y를 모두 합쳐야합니다. 예를 들어 (x1, y1), (x2, y2), (x3, y3), (x4 y4)가 있을 때 (x1 - x2, y1 - y2), (x3 - x4, y3 - y4) 2개의 벡터를 만들 수 있고 이들의 합은 (x1 + x3 - x2 - x4, y1 + y3 - y2 - y4)가 되게 됩니다. 결론적으로 nCn/2개를 뽑아서 더하고 나머지 nCn/2를 빼주면 x, y를 구해줄 수 있습니다. 각각의 조합에서 얻을 수 있는 벡터 합의 길이를 계산하여 최소값을 구해주면 됩니다.

 

import sys, math
from itertools import combinations

INT_MAX = sys.maxsize
#sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

T = int(input())

for _ in range(T):
    n = int(input())

    points = [
        tuple(map(int, input().split()))
        for _ in range(n)
    ]

    candi = combinations(range(n), n // 2)
    ans = INT_MAX

    for combi in candi:
        isPlus = [False] * n

        for idx in combi:
            isPlus[idx] = True

        x = 0
        y = 0

        for i in range(n):
            if isPlus[i]:
                x += points[i][0]
                y += points[i][1]
            else:
                x -= points[i][0]
                y -= points[i][1]

        ans = min(ans, math.sqrt(x ** 2 + y ** 2))

    print(ans)

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 소형기관차  (0) 2023.03.26
[백준] 음악프로그램  (0) 2023.03.25
[백준] 양팔저울  (0) 2023.03.24
[백준] 치즈  (1) 2023.03.23
[백준] 백양로 브레이크  (0) 2023.03.22