Algorithm Problem/Python

[python] SWEA - 1251. [S/W ๋ฌธ์ œํ•ด๊ฒฐ ์‘์šฉ] 4์ผ์ฐจ - ํ•˜๋‚˜๋กœ

deo2kim 2020. 8. 12. 08:23
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

1. D4 | MST - prim

2. ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜๋Š” ์ธ์ ‘ ํ–‰๋ ฌ์„ ๋งŒ๋“ ๋‹ค

3. ์ตœ์†Œ ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ค„ ๊ฐ€์ค‘์น˜ ๋ฆฌ์ŠคํŠธ, MST์— ํฌํ•จ๋˜์ง€ ์ฒดํฌํ•˜๋Š” ๋ฆฌ์ŠคํŠธ, ๋ถ€๋ชจ๋…ธ๋“œ ์„ ํƒ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

(์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ๋…ธ๋“œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ)

4. ์‹œ์ž‘์ ์„ ์„ ํƒ(์—ฌ๊ธฐ์„œ๋Š” 0)ํ•˜๊ณ  ๊ฐ„์„ ์„ ๋Œ๋ฉฐ ํƒ์ƒ‰ํ•œ๋‹ค

 (1) ์•„์ง MST์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ , ๊ฐ€์ค‘์น˜๊ฐ€ ์ตœ์†Œ์ธ ์ •์  u๋ฅผ ์ฐพ๋Š”๋‹ค.

 (2) u๋ฅผ MST์— ํฌํ•จ์‹œํ‚ค๊ณ , ๊ทธ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฒฐ๊ณผ๊ฐ’์— ๋”ํ•ด์ค€๋‹ค.

 (3) ๊ฐ€์ค‘์น˜๋ฅผ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด u์— ์ธ์ ‘ํ•˜๊ณ  ์•„์ง mst๊ฐ€ ์•„๋‹Œ ์ •์ (w) ์ค‘์—์„œ key[w] > u-w ์ด๋ฉด ๊ฐฑ์‹ ํ•œ๋‹ค

5. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•  ๋•Œ๊นŒ์ง€ 4๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

๐Ÿ’จ ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ํฌ๋ฃจ์Šค์นผ๊ณผ ํ”„๋ฆผ์ค‘์—์„œ ํ”„๋ฆผ์„ ์„ ํƒํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

 for tc in range(1, 1+int(input())):
    n = int(input()) # ์„ฌ์˜ ๊ฐฏ์ˆ˜
    x = list(map(int, input().split())) # ์„ฌ์˜ x ์ขŒํ‘œ
    y = list(map(int, input().split())) # ์„ฌ์˜ y ์ขŒํ‘œ
    E = float(input()) # ์„ธ์œจ

    # ์ธ์ ‘ ํ–‰๋ ฌ ์ƒ์„ฑ
    adj = [[0]*n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            adj[i][j] = ((x[i]-x[j])**2 + (y[i]-y[j])**2)
            adj[j][i] = ((x[i]-x[j])**2 + (y[i]-y[j])**2)

    # for row in adj:
    #     print(row)

    # key ๊ฐ€์ค‘์น˜, mst ๋ฐฉ๋ฌธ ๊ฐœ๋…, p ์—ฐ๊ฒฐ ๋…ธ๋“œ
    INF = float('inf')
    key = [INF]*n
    mst = [False]*n
    p = [-1]*n

    # ์‹œ์ž‘์  ์„ ํƒ: ๋‚˜๋Š” 0์„ ํƒํ•จ
    key[0] = 0
    cnt = 0
    result = 0
    while cnt < n:
        # ์•„์ง mst๊ฐ€ ์•„๋‹ˆ๊ณ  key๊ฐ€ ์ตœ์†Œ์ธ ์ •์  ์„ ํƒ : u
        minKey = INF
        u = -1
        for i in range(n):
            if not mst[i] and key[i] < minKey:
                minKey = key[i]
                u = i

        # u๋ฅผ mst๋กœ ์„ ํƒ
        mst[u] = True
        result += minKey
        cnt +=1

        # key๊ฐ’์„ ๊ฐฑ์‹ 
        # u์— ์ธ์ ‘ํ•˜๊ณ  ์•„์ง mst๊ฐ€ ์•„๋‹Œ ์ •์  w์—์„œ key[w] > u-w ์ด๋ฉด ๊ฐฑ์‹ 
        for w in range(n):
            if adj[u][w] > 0 and not mst[w] and key[w] > adj[u][w]:
                key[w] = adj[u][w]
                p[w] = u # ๋‚˜ํ•œํ…Œ ์ฐพ์•„์˜ค๋Š” ์นœ๊ตฌ

    print('#{} {}'.format(tc, round(result*E)))

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: SW Expert Academy

๋งํฌ: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15StKqAQkCFAYD&categoryId=AV15StKqAQkCFAYD&categoryType=CODE

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com

๋‹น์‹ ์€ ์ธ๋„๋„ค์‹œ์•„ ๋‚ด์˜ N๊ฐœ์˜ ์„ฌ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตํ†ต์‹œ์Šคํ…œ ์„ค๊ณ„ ํ”„๋กœ์ ํŠธ์ธ ‘ํ•˜๋‚˜๋กœ’๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋กœ ํ”„๋กœ์ ํŠธ๋Š” ์ฒœํ•ด์˜ ์ž์—ฐ์„ ๊ฐ€์ง„ ์ธ๋„๋„ค์‹œ์•„์˜ ๊ฐ ์„ฌ ๊ฐ„ ๊ตํ†ต์ด ์›ํ™œํ•˜์ง€ ์•Š์•„ ๊ด€๊ด‘ ์‚ฐ์—…์˜ ๋ฐœ์ „์„ ์ €ํ•ดํ•˜๋Š” ์š”์†Œ๋ฅผ ์ค„์ด๊ณ  ๋ถ€๊ฐ€ ๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๊ณ ์ž ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ธ๋„๋„ค์‹œ์•„ ๋‚ด์˜ ๋ชจ๋“  ์„ฌ์„ ํ•ด์ €ํ„ฐ๋„๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์ €ํ„ฐ๋„์€ ๋ฐ˜๋“œ์‹œ ๋‘ ์„ฌ์„ ์„ ๋ถ„์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ๋‘ ํ•ด์ € ํ„ฐ๋„์ด ๊ต์ฐจ๋œ๋‹ค ํ•˜๋”๋ผ๋„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ, A์„ฌ์—์„œ D์„ฌ์œผ๋กœ๋Š” ์—ฐ๊ฒฐ๋˜์—ˆ์ง€๋งŒ A์„ฌ์œผ๋กœ๋ถ€ํ„ฐ B์„ฌ, C์„ฌ์—๋Š” ๋„๋‹ฌ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 
๋‹ค์Œ ๋‘ ๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋Š” ๋ชจ๋“  ์„ฌ์ด ์—ฐ๊ฒฐ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 


์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ธ๋„๋„ค์‹œ์•„ ๋‚ด์˜ ๋ชจ๋“  ์„ฌ๋“ค์„ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 3์—์„œ B์™€ A์ฒ˜๋Ÿผ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ, B์™€ C์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์„ฌ์— ๊ฑธ์ณ ๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ธ๋„๋„ค์‹œ์•„์—์„œ๋Š” ํ•ด์ €ํ„ฐ๋„ ๊ฑด์„ค๋กœ ์ธํ•ด ํŒŒ๊ดด๋˜๋Š” ์ž์—ฐ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™˜๊ฒฝ ๋ถ€๋‹ด๊ธˆ ์ •์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

- ํ™˜๊ฒฝ ๋ถ€๋‹ด ์„ธ์œจ(E)๊ณผ ๊ฐ ํ•ด์ €ํ„ฐ๋„ ๊ธธ์ด(L)์˜ ์ œ๊ณฑ์˜ ๊ณฑ(E * L2)๋งŒํผ ์ง€๋ถˆ

์ด ํ™˜๊ฒฝ ๋ถ€๋‹ด๊ธˆ์„ ์ตœ์†Œ๋กœ ์ง€๋ถˆํ•˜๋ฉฐ, N๊ฐœ์˜ ๋ชจ๋“  ์„ฌ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตํ†ต ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜์‹œ์˜ค.

64๋น„ํŠธ integer ๋ฐ double๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, overflow๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (C/C++ ์—์„œ 64๋น„ํŠธ integer๋Š” long long ์œผ๋กœ ์„ ์–ธ).

์œ„์˜ ๊ทธ๋ฆผ 2์€ ํ™˜๊ฒฝ ๋ถ€๋‹ด๊ธˆ์„ ์ตœ์†Œ๋กœ ํ•˜๋ฉฐ ๋ชจ๋“  ์„ฌ์„ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๋ฆผ 3๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[์ž…๋ ฅ]

๊ฐ€์žฅ ์ฒซ ์ค„์€ ์ „์ฒด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜์ด๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ์ค„์—๋Š” ์„ฌ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง€๊ณ  (1≤N≤1,000),

๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ๊ฐ ์„ฌ๋“ค์˜ ์ •์ˆ˜์ธ X์ขŒํ‘œ, ์„ธ ๋ฒˆ์งธ ์ค„์—๋Š” ๊ฐ ์„ฌ๋“ค์˜ ์ •์ˆ˜์ธ Y์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค (0≤X≤1,000,000, 0≤Y≤1,000,000).

๋งˆ์ง€๋ง‰์œผ๋กœ, ํ•ด์ €ํ„ฐ๋„ ๊ฑด์„ค์˜ ํ™˜๊ฒฝ ๋ถ€๋‹ด ์„ธ์œจ ์‹ค์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค (0≤E≤1).

[์ถœ๋ ฅ]

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๋‹ต์„ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋ฉฐ, ๊ฐ ์ผ€์ด์Šค๋งˆ๋‹ค ์ค„์˜ ์‹œ์ž‘์— “#C”๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์ด๋•Œ C๋Š” ์ผ€์ด์Šค์˜ ๋ฒˆํ˜ธ์ด๋‹ค.

๊ฐ™์€ ์ค„์— ๋นˆ์นธ์„ ํ•˜๋‚˜ ๋‘๊ณ , ์ฃผ์–ด์ง„ ์ž…๋ ฅ์—์„œ ๋ชจ๋“  ์„ฌ๋“ค์„ ์ž‡๋Š” ์ตœ์†Œ ํ™˜๊ฒฝ ๋ถ€๋‹ด๊ธˆ์„ ์†Œ์ˆ˜ ์ฒซ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•˜๋ผ.

๋ฐ˜์‘ํ˜•