DevLog ๐Ÿ“จ/Baekjoon

[BaekJoon] 1007: ๋ฒกํ„ฐ ๋งค์นญ

cece00 2023. 2. 16. 00:59

BaekJoon 1007: ๋ฒกํ„ฐ ๋งค์นญ

ํ’€์ด ๋ฐฉ๋ฒ•

์ง‘ํ•ฉ P๋Š” n๊ฐœ์˜ ์ ๋“ค์˜ ์ง‘ํ•ฉ์ด๊ณ , P์˜ ๋ฒกํ„ฐ ๋งค์นญ์€ P์˜ ๋ชจ๋“  ์ ์„ ํ•œ ๋ฒˆ์”ฉ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ๋ฒกํ„ฐ์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ฆ‰,

$P = {(x_1, y_1), (x_2, y_2), \dots , (x_n, y_n)}$

$VM = {(x_i - x_j,\space y_i - y-j)\space|\space 1 \le i, j \le n, i \ne j }$

 

๋”ฐ๋ผ์„œ ๋ฒกํ„ฐ ๋งค์นญ์— ์†ํ•˜๋Š” ๋ชจ๋“  ๋ฒกํ„ฐ์˜ ํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
$v_1 = (x_2 - x_1, \space y_2 - y_1)$
$v_2 = (x_4 - x_3, \space y_4 - y_3)$
$ \dots $
$v_{n/2} = (x_n - x_{n-1}, \space y_n - y_{n-1})$

$v_1 + v_2 + ... + v_{n/2} =
((x_2 + x_4 + ... + x_n) - (x_1 + x_3 + ... + x_{n-1}),\space
(y_2 + y_4 + ... + y_n) - (y_1 + y_3 + ... + y_{n-1}))$

$v_1 + v_2 + ... + v_{n/2} =
\sum_{k=1}^n x_k - 2\sum_{k=1}^n x_{2k-1},\space
\sum_{k=1}^n y_k - 2\sum_{k=1}^n y_{2k-1})$

 

์ด๋•Œ ๊ฐ€๋Šฅํ•œ ๋ฒกํ„ฐ ๋งค์นญ์˜ ๊ฐ€์ง“์ˆ˜๋Š” ์ง‘ํ•ฉ P์—์„œ $N/2$ ๊ฐœ์˜ ์ถœ๋ฐœ์ ์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์™€ ๊ฐ™์œผ๋ฏ€๋กœ, ํ•ด๋‹น ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฒกํ„ฐํ•ฉ์˜ ๊ธธ์ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Brute Force๋กœ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ $nC{n/2}$ ์ด๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. ์ง‘ํ•ฉ P์˜ ๋ชจ๋“  ์ ์— ๋Œ€ํ•ด x์ขŒํ‘œ๋ผ๋ฆฌ, y์ขŒํ‘œ๋ผ๋ฆฌ ๊ฐ๊ฐ ๋”ํ•œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  2. ์ง‘ํ•ฉ P์—์„œ ๋ฒกํ„ฐ์˜ ์ถœ๋ฐœ์ ์— ํ•ด๋‹นํ•˜๋Š” N/2๊ฐœ์˜ ์ ์„ ์„ ํƒํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค.
  3. 2์—์„œ ์ €์žฅ๋œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด, ํ•ด๋‹น ๊ฒฝ์šฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒกํ„ฐ ํ•ฉ์˜ ๊ธธ์ด๋ฅผ ์—ฐ์‚ฐํ•ด ์ด์ „์˜ ์ตœ์†Ÿ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์„ ๊ฒฝ์šฐ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋ฒกํ„ฐ ํ•ฉ์€ 1์—์„œ ์ €์žฅ๋œ x์ขŒํ‘œ, y์ขŒํ‘œ์˜ ์ดํ•ฉ์—์„œ ์ถœ๋ฐœ์ ์˜ x์ขŒํ‘œ ํ•ฉ,y์ขŒํ‘œ ํ•ฉ์„ ๋‘ ๋ฒˆ์”ฉ ๋นผ์„œ ๊ณ„์‚ฐํ•œ๋‹ค.
  4. 2์—์„œ ์ €์žฅ๋œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋˜๋ฉด ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œํ–‰์ฐฉ์˜ค

  • ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ ธ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ง‘ํ•ฉ P์—์„œ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ–ˆ๋Š”๋ฐ, ๋ฒกํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์˜ ๊ฐœ์ˆ˜์˜ ์ ˆ๋ฐ˜์ด๋ผ๋Š” ์ ์„ ์ œ๋Œ€๋กœ ์ฒดํฌํ–ˆ๋‹ค๋ฉด ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ํ’€์ดํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์•˜๋‚˜ ์‹ถ๋‹ค.
  • ์ฒซ ๋ฒˆ์จฐ ์ ‘๊ทผ์—์„œ๋Š” ํŒฉํ† ๋ฆฌ์–ผ ์ˆ˜์ค€์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋‚˜์™”์œผ๋‚˜.. ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋Š” ํŒฉํ† ๋ฆฌ์–ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ 1์ˆœ์œ„ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ž˜ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค. ์ถœ๋ฐœ์ ์„ ์„ ํƒํ•˜๋ฉด (๋ชจ๋“  ์ ์„ ํ•œ ๋ฒˆ์”ฉ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ) ๋„์ฐฉ์ ๋„ ์ž๋™์œผ๋กœ ์„ ํƒ๋œ๋‹ค๋Š” ์ ์ด ํ‚คํฌ์ธํŠธ์˜€๋‹ค.

์ „์ฒด ์ฝ”๋“œ

from itertools import combinations
import math

T = int(input())

for _ in range(T):
    N = int(input())
    P = [(0, 0) for _ in range(N)]
    xsum, ysum = 0, 0

    for i in range(N):
        x, y = map(int, input().split())
        xsum += x
        ysum += y
        P[i] = (x,y)

    cases = list(combinations(P, N // 2))
    min = -1

    for case in cases:  # NC(N/2)
        vsum = [xsum, ysum]

        for point in case:
            vsum[0] -= (2 * point[0])
            vsum[1] -= (2 * point[1])

        length = math.sqrt(pow(vsum[0], 2) + pow(vsum[1], 2))

        if (length < min or min < 0):
            min = length

    print(min)