[BOJ][๐ก5][๋ฐฑ์ค#15686] ์นํจ ๋ฐฐ๋ฌ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
ํฌ๊ธฐ๊ฐ NรN์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1ร1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ c๋ฒ์งธ ์นธ์ ์๋ฏธํ๋ค. r๊ณผ c๋ 1๋ถํฐ ์์ํ๋ค. ์ด ๋์์ ์ฌ๋ ์ฌ๋๋ค์ ์นํจ์ ๋งค์ฐ ์ข์ํ๋ค. ๋ฐ๋ผ์, ์ฌ๋๋ค์ย โ์นํจ ๊ฑฐ๋ฆฌโ๋ผ๋ ๋ง์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ย ๊ฑฐ๋ฆฌ์ด๋ค. ์ฆ, ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง์ ๊ธฐ์ค์ผ๋ก ์ ํด์ง๋ฉฐ, ๊ฐ๊ฐ์ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๋ ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด๋ค. ์์์ ๋ ์นธ (r1, c1)๊ณผ (r2, c2) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|๋ก ๊ตฌํ๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ง๋๋ฅผ ๊ฐ๋ ๋์๋ฅผ ์ดํด๋ณด์.
0 2 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 2
0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ด๋ค. (2, 1)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-1| + |1-2| = 2, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-5| + |1-5| = 7์ด๋ค. ๋ฐ๋ผ์, (2, 1)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 2์ด๋ค. (5, 4)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-1| + |4-2| = 6,ย (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-5| + |4-5| = 1์ด๋ค. ๋ฐ๋ผ์, (5, 4)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค. ์ด ๋์์ ์๋ ์นํจ์ง์ ๋ชจ๋ ๊ฐ์ ํ๋์ฐจ์ด์ฆ์ด๋ค. ํ๋ ์ฐจ์ด์ฆ ๋ณธ์ฌ์์๋ ์์ต์ ์ฆ๊ฐ์ํค๊ธฐ ์ํด ์ผ๋ถ ์นํจ์ง์ ํ์ ์ํค๋ ค๊ณ ํ๋ค. ์ค๋ ์ฐ๊ตฌ ๋์ ์ด ๋์์์ ๊ฐ์ฅ ์์ต์ ๋ง์ด ๋ผ ์ ์๋ ย ์นํจ์ง์ ๊ฐ์๋ ์ต๋ M๊ฐ๋ผ๋ ์ฌ์ค์ ์์๋ด์๋ค. ๋์์ ์๋ ์นํจ์ง ์ค์์ ์ต๋ M๊ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋๋จธ์ง ์นํจ์ง์ ๋ชจ๋ ํ์ ์์ผ์ผ ํ๋ค. ์ด๋ป๊ฒย ๊ณ ๋ฅด๋ฉด, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์๊ฒ ๋ ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(2ย โค N โค 50)๊ณผ M(1 โค M โค 13)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋์์ ์ ๋ณด๋ 0, 1, 2๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , 0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ ์๋ฏธํ๋ค. ์ง์ ๊ฐ์๋ 2N๊ฐ๋ฅผ ๋์ง ์์ผ๋ฉฐ, ์ ์ด๋ 1๊ฐ๋ ์กด์ฌํ๋ค. ์นํจ์ง์ ๊ฐ์๋ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 13๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ ์ํค์ง ์์ ์นํจ์ง์ ์ต๋ M๊ฐ๋ฅผ ๊ณจ๋์ ๋, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
5 3
0 0 1 0 0
0 0 2 0 1
0 1 2 0 0
0 0 1 0 0
0 0 0 0 2
์ถ๋ ฅ
5
์์ 2
์ ๋ ฅ
5 2
0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
2 0 0 1 1
2 2 0 1 2
์ถ๋ ฅ
10
์์ 3
์ ๋ ฅ
5 1
1 2 0 0 0
1 2 0 0 0
1 2 0 0 0
1 2 0 0 0
1 2 0 0 0
์ถ๋ ฅ
11
์์ 4
์ ๋ ฅ
5 1
1 2 0 2 1
1 2 0 2 1
1 2 0 2 1
1 2 0 2 1
1 2 0 2 1
์ถ๋ ฅ
32
My Sol
import sys
input = sys.stdin.readline
def pick(i, s, M):
global chickens, chickensAlive
global visited, ans
if i == M:
ans = min(ans, calcDistance(chickensAlive))
return
for k in range(s, chickensCnt):
if not visited[k]:
visited[k] = 1
chickensAlive.append(chickens[k])
pick(i+1, k+1, M)
visited[k] = 0
chickensAlive.pop()
def calcDistance(chickensAlive):
global houses
summin_d = 0
for house in houses:
hi, hj = house
d_lst = []
for chicken in chickensAlive:
ci, cj = chicken
d = abs(ci-hi) + abs(cj-hj)
d_lst.append(d)
summin_d += min(d_lst)
return summin_d
N, M = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(N)]
chickens = []
chickensCnt = 0
houses = []
for i in range(N):
for j in range(N):
if mat[i][j]==1:
houses.append((i, j))
elif mat[i][j]==2:
chickens.append((i, j))
chickensCnt += 1
visited = [0]*chickensCnt
chickensAlive = []
ans = 1000000
pick(0, 0, M)
print(ans)
๋ณต์กํด๋ณด์ด์ง๋ง ๋ ผ๋ฆฌ์ ํ๋ฆ์ ์ ๊ณ ๋ คํ๋ฉด ์ถฉ๋ถํ ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
์ ๋ ฅ ์ฒ๋ฆฌ ๋ฐ ๋ณ์ ์ ์
N๊ณผ M, mat 2์ฐจ์ ๋ฐฐ์ด์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , mat์ผ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์ป์ด์ ์๋ ์ ์ํ ๋ณ์๋ค์ ์ฑ์๋ฃ๋๋ค. x, y ์ขํ๋ฅผ tuple๋ก ์ฝ์ ํ๊ณ , index๋ 0๋ถํฐ ๋ฐ์๋ค. ์ด์ฐจํผ distance๋ฅผ ๊ตฌํ ๋๋ ์ฐจ์ด๊ฐ์ผ๋ก ๊ณ์ฐํ๋ฏ๋ก ๊ตณ์ด 1๋ถํฐ ์์ํ ํ์๋ ์๋ค.
๋์์ ์นํจ์ง์ ๋ชจ๋ ์ขํ๋ฅผ chickens
์ ๋ฃ์๋ค. ๋์์ ์ง์ ๋ชจ๋ ์ขํ๋ฅผ houses
์ ๋ฃ์๋ค. ์นํจ์ง์ ์๋ฅผ ์ฒ์์ ์ ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ดํ ์์ ํ์์์ ์ขํ๊ฐ์ด 1์ธ ๊ฒฝ์ฐ ์นํจ์ง์ ์๋ฅผ ์๋ฏธํ๋ chickensCnt
๋ฅผ 0์ผ๋ก ์ ์ํ์ฌ 1์ฉ ์ฌ๋ ค์ค๋ค.
์์ ํ์
mat์ ๋ชจ๋ ์ขํ์ ๋ํด ๊ฐ์ ์กฐํํ๋ค. 1์ด๋ฉด houses์ ์ขํ๋ฅผ tuple๋ก ์ฝ์ ํ๊ณ , 2์ด๋ฉด chickens์ ์ขํ๋ฅผ tuple๋ก ์ฝ์ ํ๋ค. chickens์ ์ฝ์ ํ ๋๋ง๋ค chickensCnt๋ฅผ 1์ฉ ์ฌ๋ ค์ค๋ค.
์ฌ๊ท์ ์กฐํฉ : pick()
M๊ฐ์ ์นํจ์ง์ ์ด๋ฆฌ๋ ค ํ ๋, ์ ์ฒด ์นํจ์ง์ ์งํฉ์ธ chickens์ ๊ฐ ์ขํ๋ง๋ค M๊ฐ๋ฅผ ๋ฝ๋ ๋ฐฉ์์ด๋ค. ์ด๋ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ์กฐํฉ์ด๋ฉฐ, ์ด๋ฅผ ์ฌ๊ท์ธ pick()
ํจ์๋ก ๊ตฌํํ์๋ค. dfs์ stack์ ์์์ ์นํจ์ง์ ์ ํํ์ฌ ์ขํ๋ฅผ ๋ฃ์ผ๋ฉฐ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํ M๊ฐ์ ์นํจ์ง ์งํฉ์ ๊ตฌํด๋ธ๋ค.
์ด ๊ฐ๊ฐ์ ์ํฉ๋ง๋ค ์นํจ์ง์ ๊ฐ์๊ฐ M์ผ ๋์ ์์์ ์ด์์๋ ์นํจ์ง ์ขํ๋ฅผ chickensAlive
๋ฅผ ์ ์ํ์ฌ ์ถ๊ฐํ์๋ค.
๊ฑฐ๋ฆฌ ๊ณ์ฐ : calcDistance()
๋ชจ๋ ์ํฉ์ chickensAlive์ ๋ํ์ฌ pick() ํจ์ ๋ด๋ถ์์ calcDistance()
ํจ์๋ฅผ ํธ์ถํ๋ค. ์ธ์๋ก๋ chickensAlive ์งํฉ์ ๋ฐ๋๋ค.
์ด ํจ์๋ houses์ ๊ฐ ์ขํ๋ค์ ๋ํ์ฌ chickensAlive์ ๊ฐ ์นํจ์ง์ ๋ชจ๋ ์ํํด ์ง์ง๋ง๋ค ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ๋ํด ๋ฐํํ๋ค.
์ด ๋ฐํ๊ฐ์ pick() ํจ์ ๋ด๋ถ์์ ์ ์ญ๋ณ์์ธ ans์ ๋น๊ตํด ๋ ์์ ๊ฐ์ ans์ ์ ์ฅํ๋ค. ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์กฐํํ๋ฉด ์ด ans๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ