๋šœ๋ถ€๋‹ˆ์˜ Devlog

[BOJ] 15686.์น˜ํ‚จ๋ฐฐ๋‹ฌ (Python)

by ๋šœ๋ถ€๋‹ˆ

 

 

15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ

www.acmicpc.net

 

์ด ๋ฌธ์ œ์—์„œ๋Š” NxN ํฌ๊ธฐ์˜ ๋„์‹œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ(0), ์ง‘(1), ์น˜ํ‚จ์ง‘(2) ์ค‘ ํ•˜๋‚˜๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ์ง‘๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์ด๋ฉฐ, ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ํ•ฉ์ž…๋‹ˆ๋‹ค.

๊ฑฐ๋ฆฌ d = |r1 - r2| + |c1 -c2| ๋กœ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๋„์‹œ์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘ ์ค‘ ์ตœ๋Œ€ M๊ฐœ๋ฅผ ๊ณ ๋ฅด๊ณ  ๋‚˜๋จธ์ง€๋Š” ํ์—…์‹œํ‚ฌ ๋•Œ, ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ์ตœ์†Œ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

์น˜ํ‚จ์ง‘์„ M๊ฐœ์”ฉ ์กฐํ•ฉ์„ ํ†ตํ•ด ๋งŒ๋“ค๊ณ ,

๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•œ ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉฐ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.

 

# ์น˜ํ‚จ๋ฐฐ๋‹ฌ
import sys

def distance(chicken) : # ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
    dist = 0
    for r1, c1 in home :
        dist += min([(abs(r1-r2) + abs(c1-c2)) for r2, c2 in chicken])
    return dist

def dfs(L, cur) : # ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด ์น˜ํ‚จ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š” ํ•จ์ˆ˜
    global min_dist
    if L == M :
        select_chicken = [chicken[i] for i in range(chilen) if visited[i]]
        min_dist = min(min_dist, distance(select_chicken))
        return
    
    for i in range(cur, chilen) :
        if visited[i] == 0 :
            visited[i] = 1
            dfs(L + 1, i + 1)
            visited[i] = 0

if __name__=="__main__" : 
    input = sys.stdin.readline

    N, M = map(int, input().split()) # ๋„์‹œ ํฌ๊ธฐ, ์น˜ํ‚จ์ง‘ ๊ฐœ์ˆ˜
    city = [] # ๋„์‹œ
    chicken = [] # ์น˜ํ‚จ์ง‘
    home = [] # ์ง‘

    for r in range(N) :
        temp = list(map(int, input().split()))
        city.append(temp) # ๋„์‹œ์˜ ๊ฐ ํ–‰์— ๋Œ€ํ•œ ์ •๋ณด ์ถ”๊ฐ€
        for c in range(N) :
            if temp[c] == 2 :# ์น˜ํ‚จ์ง‘์ธ ๊ฒฝ์šฐ
                chicken.append((r,c))
            elif temp[c] == 1 : # ์ง‘์ธ ๊ฒฝ์šฐ
                home.append((r,c))
    
    if len(chicken) == M : # ์ด๋ฏธ M๊ฐœ์ด๋ฏ€๋กœ ์น˜ํ‚จ์ง‘์„ ํ์—…์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์—†์Œ
        print(distance(chicken))
    else : # M๊ฐœ์”ฉ ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•จ
        min_dist = 2147000000 # ๋Œ€๋žต์ ์ธ ํฐ ์ˆ˜๋กœ ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ์ดˆ๊ธฐํ™”
        chilen = len(chicken)
        visited = [0] * chilen
        dfs(0, 0)
        print(min_dist)

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

๋šœ๋ถ€๋‹ˆ์˜ Devlog

๋šœ๋ถ€๋‹ˆ

ํ™œ๋™ํ•˜๊ธฐ