Algorithm ๋ฌธ์ ํ ๋, ๊ณ ๋ คํด์ผ ํ ์ฌํญ
๋ฐฐ์ด์ ์์ผ๋ก ๋ถ์ด๋ ๊ฑด ๋ง์ด ์๋จ
# ๋๋ฌด ์ ํ
ํฌ 16235๋ฒ
# ๋ฌด์ธ๊ฐ ์๋ก ๋ค์ด์ค๋ ์๊ฐ 1์ด๊ณ , ๊ณ์ ๋์ด๋๋ค๊ณ ๊ฐ์ ํ์.
# ๊ทธ๋ ๋ค๋ฉด ๋ฐ๋ก ์ ๋ ฌ์ ํด์ค ํ์๊ฐ ์๋ค. ๋ค๋ ์์ ๋ฃ์ด ์ฃผ๋ฉด ํฌ๊ธฐ์ ์์๊ฐ ๋ณ๊ฒฝ ๋์ง ์๊ธฐ ๋๋ฌธ
# ๊ทธ๋ด๋ ์๋ก์ด ์๋ฅผ ์์ผ๋ก ๋ฃ๋ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ก ๋ฃ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ,
list = [3 ,4 ,5 ]
list = [0 for _ in range (leng )] + [3 ,4 ,5 ]
list = [5 ,4 ,3 ]
list = list + [0 for _ in range (leng )]
# ์ด ๋๊ฐ์ ์๋ ์ฐจ์ด๋ ์ด๋ง์ด๋ง ํ๋ฏ๋ก ๋ฌด์กฐ๊ฑด ํ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์.
# why? ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ ์ฒด๋ฅผ ๋ฐ๊ฟ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
N X N ํ๋ ฌ์ ํ์ํ ๋, visited ๋ N ์ด ์์ ๋๋ 1์ฐจ์ ๋ฐฐ์ด์ผ๋ก ํ๊ณ , N ์ด ํด ๋๋ ๋ฌด์กฐ๊ฑด 2์ฐจ์ ๋ฐฐ์ด ๋ฐฉ๋ฌธ์ผ๋ก ํด์ผํ๋ค.
# 1์ฐจ์ visited, N > 100 ์ผ๋ ์ฌ์ฉ์ ํ์ง๋ง์
visited = []
# ๋ฐฉ๋ฌธํ์ ์
visited .append ((nx ,ny ))
# ๋ฐฉ๋ฌธ ๊ฒ์ฌ
if (nx ,ny ) not in visited :
# 2์ฐจ์ visited
visited = [[0 for _ in range (M )] for _ in range (N )]
# ๊ผญ 2์ฐจ์ ์ผ ํ์ ์์ ๊ฐ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ 3์ฐจ์,4์ฐจ์๋ ๊ฐ๋ฅ
# ์๊ฐ์ ๋ฐ๋ฅธ visited๊ฐ ๋ณ๊ฒฝ์ ์ฌ์ฉ ๊ฐ๋ฅ (ex ๋นํธ๋ง์คํน ๋ฌธ์ )
Deepcopy๋ ์ฌ์ฉ ์์ ํ์.
from copy import deepcopy
# ๋ฅ์นดํผ๋ ์๊ฐ ์ด๊ณผ๋ฅผ ๊ณ ๋ คํ์ ๋ ์ ๋ง ์ ๋งํ๋ฉด ์ฌ์ฉ ์ ํ๋ ๊ฒ์ ๊ถ์ฅ
# ํ์ง๋ง ์ธ์ ์จ์ผํ๋๋? -> ๊ทธ๋ํ๊ฐ ๋ฐ๋๋๋ ์ฌ์ฉํด์ผํจ
# ์ฆ bfs์ ๊ทธ๋ํ๊ฐ ์์ ํ ๋ฐ๋์ด ๋ฒ๋ ค ๊ฐ queue๋ง๋ค ๊ทธ๋ํ๋ฅผ ์ ์ฅํ๊ณ ๊ฐ์ผํ ๋
# ex) ๋ฐฑ์ค ์ฒญ์๋
์์ด
# ๊ทธ๋ํ๊ฐ ์์ ํ ๋ฐ๋๋ ๊ฒ์ด ์๋๋ผ๋ฉด ์ฌ์ฉํ์ง๋ง๊ณ visited๋ฅผ ์ฌ์ฉํ์.
# ๊ฐ ๊ฒฝ์ฐ๋ง๋ค ๊ทธ๋ํ๊ฐ ๋ฐ๋๋ ๊ฒ์ด ์๋ ์์๊ฐ ๋ฐ๋๋ ๊ฒ์ด๋ผ๋ฉด ๊ทธ๋๋ง๋ค visited๋ฅผ ์์ฑํ์ฌ ์ฒดํฌํ๋ฉด ๋จ
# ex) ๋ฐฑ์ค ์ฐ๊ตฌ์3
0718 ๋ฐฑ์ค ๊ตฌ์ฌ ํ์ถ 2
# ๋ฐฑ์ค ๊ตฌ์ฌ ํ์ถ 2
# ์ต๋ํ ๋ณ์๋ฅผ ๊ฐ๋จํ ์ค์ ํ๊ณ ๊ฐ์.
# ์ด๋ ต๊ณ ๊ณ ๋ คํด์ผํ ์กฐ๊ฑด์ด ๋ง์ ๊น๋ค๋ก์ด ๋ฌธ์ ๋๊น ๋ค์ ํ์ด๋ณด๋ฉด ์ข์
# 10๋ฒ ์ดํ๋ก ์์ง์ฌ์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค
r_x ,r_y ,b_x ,b_y ,cnt = queue .popleft ()
if cnt > 10 :
return - 1
# ์ด๋ ๊ฒ ํ๋ฉด ํ๋ฆผ why? ์ ๋ ๊ฒ ํ๋ฉด cnt๊ฐ 10์ธ ๊ฒฝ์ฐ, ์ฆ ๊ทธ r_x,r_y์ ๋๋ฌํ๊ธฐ ์ํด 10๋ฒ ์์ง์ธ ๊ฒ์ด๋ฏ๋ก ์ด๋ฏธ ์คํจ
# ๋ง์ผ ์ ์ํ์์ ๋ต์ ์ฐพ์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ 11๋ก ๋์ด
r_x ,r_y ,b_x ,b_y ,cnt = queue .popleft ()
if cnt > 9 :
return - 1
# ์ด๋ ๊ฒ ํด์ค์ผ ์ต๋ ๊ฒฐ๊ณผ ๊ฐ์ด 10์ด ๋์ด
# ์๋ํ์ ๋น์ ํ๋ ธ๋ ํฌ์ธํธ๋ค:
# 1. ๊ธธ์ด๊ฐ ์ซ์๊ฐ 1์ธ ๊ฒฐ๊ณผ๋ฅผ ์ฒดํฌํ์ง๋ชปํ๊ณ 2๋ก ์ถ๋ ฅํ๊ฒ ํ์.
# 2. 1์ธ ๊ฒฐ๊ณผ๋ ์ฒดํฌํ๋ ๋ง์ง๋ง ์ซ์๋ ์ฒซ๋ฒ์งธ ์ซ์๊ฐ ๊ฒฐ๊ณผ๊ฐ 1์ธ ์ต์๊ฐ์ ๋๋ฅผ ๊ณจ๋ผ๋ด์ง ๋ชปํจ.
# 3. corner case์์ ์ข ๋ ๋ํ
์ผํ ๊ตฌํ์ด ํ์ํจ.
start , end = 0 , 0
sub_sum = matrix [0 ]
result = N + 1
while True :
if start == end :
# result ๊ฐ 1์ด ๋์ด๋ฒ๋ฆฌ๋ฉด ๋ค์๊ฒ ๋ณผ ํ์ ์์
if sub_sum >= S :
result = 1
break
# ๋ ๋ค ๋์ ๋๋ฌํ๋ฉด break
if end == N - 1 and start == N - 1 :
break
# ์๋๋ผ๋ฉด end๋ฅผ ํ์นธ ์์ผ๋ก ๋ณด๋ด์ผ ํจ
else :
end += 1
sub_sum += matrix [end ]
# ๋ถ๋ถํฉ์ด ๊ธฐ์ค๋ณด๋ค ํฌ๋ฉด start๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ฒจ์ฃผ๊ณ ๋ถ๋ถํฉ์์ ์ ์ ๊ฐ ๋นผ์ค
elif S <= sub_sum :
result = min (result ,end - start + 1 )
sub_sum -= matrix [start ]
start += 1
# ๋ถ๋ถํฉ์ด ๊ธฐ์ค๋ณด๋ค ์๋ค๋ฉด end๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ฒจ์ฃผ๊ณ ๋ถ๋ถํฉ์์ ๋์ค ๊ฐ ๋ํด์ค
else :
if end < N - 1 :
end += 1
sub_sum += matrix [end ]
# ๋ง์ผ end๊ฐ N-1์ ๋์ฐฉํ์ง๋ง start๋ ๋๋ฌ ๋ชปํ์ ๊ฒฝ์ฐ๊ณ ๊ธฐ์ค ๊ฐ๋ณด๋ค ์๋ค?
# start๋ฅผ ๋๊น์ง ๋ก๊ฒจ์ค ํ์๋ ์์ด ๋๋ด๋ ๋จ, ์ด์ฐจํผ ๋ถ๋ถํฉ์ ์์์ง๊ธฐ๋ง ํ๊ธฐ๋๋ฌธ
else :
break
0719 ๋ฐฑ์ค ๋ฏธ๋กํ์ถํ๊ธฐ
# point ์ด์ฐจํผ ๋ฐฉํฅ์ด ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ ์์์ ์ฐพ๋ ํฌ์ธํธ๋ฅผ ํ๋ฒ๋ง ๋์ ์ค๋ ์๊ด ์์
# why? ๊ทธ๋ ๊ฐ๋ฉด ๋์์ ์ ํด์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
# ์ด์ง๊ฐํ bfs ๋ฌธ์ ๋ visited๋ฅผ ์ด์ฉํ์ฌ ํ๋ฒ๋ง ๋๊ฑฐ๋ ๋ฐฉ๋ฌธํ๋ ์ง์ ์ ๋ค์ ๋ฐฉ๋ฌธํ๋๋ก ํ๋ฉด 100% ์๊ฐ์ด๊ณผ ๋จ.
# ์ด๋ ํ ํํ๋ก๋์ง visited๋ฅผ ๋ง๋ค์ด ์ค์ผํจ.
def search ():
for i in range (N ):
for j in range (M ):
if visited [i ][j ] == 0 :
return (i ,j )
return (- 1 ,- 1 )
result = 0
while True :
x ,y = search ()
if (x ,y ) == (- 1 ,- 1 ):
print (result )
break
else :
result += bfs (x ,y )
# ๋ฏธ๋ก๋ฅผ ํ์ถํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ๋๊ฐ์ง ๊ฒฝ์ฐ
# 1. ๋๋ค๊ฐ visited ์ฒดํฌ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ฌ์ ๋ (๋ชป๊ฐ๋๊น ๋บ๋บ ๋๋ ๊ฒฝ์ฐ)
# 2. ์ด๋ฏธ ๋ชป๊ฐ๋ค๊ณ ํ๋ช
๋ ๊ธธ์ ๊ฐ๋ผ๊ณ ํ ๋
# ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ๊ฒฝ์ฐ
# 1. ์ง์ง ๋ฐ์ผ๋ก ๋๊ฐ (iswall = False)
# 2, ๋๊ฐ ์ ์๋ค๊ณ ํ๋ช
๋ ๊ธธ์ ๊ฐ๋ผ๊ณ ํ ๋
elif visited [x ][y ] == 1 :
# ์ฒ์์ด๋ฉด
if flag :
for i ,j in step :
visited [i ][j ] = - 1
return 0
else :
return cnt
# ์ฒ์์ผ๋๋ง ์๊ฐํด์คฌ๋๋ฐ ๊ทธ๊ฑด ์๋๊ณ ์ ์ฒด์ ๊ฒฝ์ฐ์์ ๊ทธ๋ ๊ฒ ํด์ค์ผํจ
# ์ฆ 1์ธ ๊ฒฝ์ฐ๋ฅผ ๋ง๋๋๋ผ๋ ๋ด๊ฐ ๊ฑธ์ด์จ ๊ธธ์ ํฌํจ๋๋ฉด ํ์ถ ๋ชปํ๋ ๊ฑฐ์
# ๊ทธ ์ค๋ณต๋๋ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋ค์์ ํ๋๋ ์๊ฐํด๋ณด์.
# ์ง๊ธ์ step์ผ๋ก ํด๊ฒฐํ์
7/23 ๋ฐฑ์ค ๊ฐ๋ฆฌ๋ฉ๋๋ง 2
# ์๊ฐ๋ณต์ก๋??
# N < 50 ์ด๋ผ๋ฉด ์ด์ง๊ฐํ๋ฉด ์๊ฐ๋ณต์ก๋๋ ์๊ฐ ์ํด๋ ๋๋ ๊ฒฝ์ฐ
# ์ด ๋ฌธ์ ์์ N<20์ด๋ฏ๋ก ์๊ฐ๋ณต์ก๋ ๊ตฌํด๋ณด์
# ๊ธฐ์ค์ ์ ๋ชจ๋ ์ ์ผ๋ก ํ๋ฒ์ฉ ํด์ค์ผ ํจ. -> 2์ค for ๋ฌธ N * N
# ๊ทธ ์์์ d1,d2๋ฅผ ๋ฐ๊ฟ์ผ ํจ.
# ์ฒ์ ์ ๊ทผ d1,d2 ์์ ํ์ -> ์๊ฐ๋ณต์ก๋ N * N
for d1 in range (1 ,N ):
for d2 in range (1 ,N ):
# ๊ทธ๋ฌ๋ ์ด์ฐจํผ d1 + d2 < N ์ด๋ฏ๋ก ์๋๊ฐ ์ข ๋ ์ต์ ํ
for d1 in range (1 ,N ):
for d2 in range (1 ,N - d1 + 1 ):
# 5๊ฐ ๋๋ ์์น๋ฅผ ๋จผ์ ์ ํด ์ค ๋ค, ๋๋จธ์ง ๊ฒ์ ์ฑ์ฐ๋ ์์ผ๋ก ํ์
# 5๊ฐ ๋๋ ์์น๋ ๋์นญ์ด ์๋๋ฏ๋ก case๋ฅผ ๋๋ ์ ํ๋์ฝ๋ฉ ํด์ค์ผ ํจ.
# ํ์ ์จ์ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ๋๊ฒ ์ข์๋ณด์
temp = r - x
if temp > d1 :
left = y - d1 + temp - d1
else :
left = y - temp
if temp > d2 :
right = y + d2 - (temp - d2 )
else :
right = y + temp
# ๊ฐ ์์์ , d1,d2 ์์์ r,c๋ฅผ ๊ฐ๊ฐ ๊ณ์ฐํด์ค์ผ ํจ ์๊ฐ ๋ณต์ก๋ * N * N
# ๋ฐ๋ผ์ ์ด ์๊ฐ ๋ณต์ก๋ O(n) = N ^ 6 = 20 ^ 6 = 6400๋ง ์ฝ 0.64์ด ์ด๋ฏ๋ก OK
# ๋ฌด์ํ ๋ฐฉ๋ฒ์ด์ง๋ง ์๊ฐ ๋ณต์ก๋๋ฅผ ์ข ๋ ๋ํ
์ผ ํ๊ฒ ๊ณ์ฐํ๊ณ ์ค๊ณํ์
0728 ๋ฐฑ์ค ๋๋๊ณค์ปค๋ธ
# ๊ธฐ์ค์ ๋ง๋๋๊ฑฐ ์ข ์ํ๋ฏ?
# critical point -> ์ง๊ธ ์์์ ์ด ๋ณ๊ฒฝ๋ผ์ ๊ฐ ๊ณณ์ด ์ ์ผ ๋จผ๊ณณ์ด๊ณ , ๊ธฐ์ค์ ์ด ๋๋ค.
x_cri ,y_cri = step [- 1 ]
length = len (step )- 1
for st in range (length ,- 1 ,- 1 ):
# 90๋ ํ์ ์ ์๋ฏธ -> ์์ ์ด ์์์ ์ผ๋ก ๋ฐ๋๋ค๊ณ ์๊ฐํ์.
# x,y๋ 90๋ ํ์ ์ํฌ ์ขํ x_cri,y_cri๋ ๊ธฐ์ค์
# x_var, y_var์ ๊ฐ ์ขํ๊ฐ ์์ ์ ์์๋๋ก ์นํํ ์ขํ
# ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ -> x์ ์ขํ์ y๋ณํ๋ ๋ํ๊ณ y์ขํ์ x์ขํ ๋บ๋ค.(์ผ์ )
x ,y = step [st ]
x_var ,y_var = x - x_cri , y - y_cri
nx ,ny = x_cri + y_var , y_cri - x_var
if iswall (nx ,ny ):
matrix [nx ][ny ] = 1
step .append ([nx ,ny ])
0731 ๋ฐฑ์ค ์๋ก์ด ๊ฒ์2
# ๋นก๊ตฌํ ๋ฌธ์
# ์ค๋๋ง์ ํ์ด์ ๊ทธ๋ฐ๊ฐ ์ฒด๊ณ์ ์ผ๋ก ์ ๊ทผํ์ง ๋ชปํจ
# ํจ์ํ ํด์ ํธ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ + ๋ฌธ์ ์ค๊ณ๋ฅผ ์ฐฉ์คํ ํด์ผํจ
# ํจ์ํ ์์๋ ๊ฐ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ํ์
# ์ฒ์์ ์ง ์ฝ๋๋ ์๋ง์ด ์๋ค -> ๋ณต์กํ๋๋ผ๋ ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ต์ํ ํ์ฌ ํ์ด์ผํจ
# ์๊ฐ -> ํ์์์ด๋ ๋นจ๊ฐ์์ ๊ฑฐ์ ๋๊ฐ์ผ๋ ์ฐจ์ด๋ ๋ง์ง๋ง์ ๋ค์ง์ด ์ฃผ๋ ๊ฒ
# moving ์ ํจ์ํ ํ์ฌ ์ค๋ณต ์ต์ํ
def moving (nx ,ny ,x ,y ,idx ):
# state์์ ์์ง์ด๋๋ฐ, ์์ง์ด๋ ํจ์๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ๊น?
# ํ๋ํ๋ ์์ง์ด์ง๋ง๊ณ ๋จ์ฒด๋ก ์์ง์ด๋ฉด ๋จ.
# ์ด์ฐจํผ ๋ณธ์ธ๋ณด๋ค ์์ ์๋ ์ ๋ค์ ์ธํธ๋ก ์์ง์
stack = []
for i in range (len (state [x ][y ])- 1 ,- 1 ,- 1 ):
temp = state [x ][y ].pop ()
stack .append (temp )
data [temp ][0 ],data [temp ][1 ] = nx ,ny
if temp == idx :
break
return stack
def go_white (nx ,ny ,x ,y ,idx ):
state [nx ][ny ] += moving (nx ,ny ,x ,y ,idx )[::- 1 ]
def go_red (nx ,ny ,x ,y ,idx ):
state [nx ][ny ] += moving (nx ,ny ,x ,y ,idx )
# ํ๋์์ด๋ ๋ฒฝ์ด๋ ๊ฒฝ์ฐ๊ฐ ๋๊ฐ์ผ๋ฏ๋ก ์ค๋ณต ์ฝ๋ ์ต์ํ
# ์ด ๊ฒฝ์ฐ ๋ฐฉํฅ ๋ฐ๊ฟ์ฃผ๊ณ ํ๋ฒ ๋ํด์ผํจ -> ๋นจ๊ฐ์ ํ์์์ ํจ์ํ ํ๋ฏ๋ก์จ ์ค๋ณต ์ต์ํ.
# ํ๊ฒผ์ ๋ ๋ ํ๊ธด๋ค? -> ๋ฐฉํฅ๋ง ๋ฐ๊ฟ์ค , ๋นจ๊ฐ์orํ์์์ด๋ค? -> ๋๊ฐ์ด ์ฒ๋ฆฌํ๊ณ ๋ฐฉํฅ๋ฐ๊ฟ
if iswall (nx ,ny ) == False or matrix [nx ][ny ] == 2 :
if d == 1 : d = 2
elif d == 2 : d = 1
elif d == 3 : d = 4
elif d == 4 : d = 3
nx ,ny = x + dx [d ],y + dy [d ]
if iswall (nx , ny ) == False or matrix [nx ][ny ] == 2 :
data [iteration ][2 ] = d
nx ,ny = x ,y
elif matrix [nx ][ny ] == 0 :
go_white (nx ,ny ,x ,y ,iteration )
data [iteration ][2 ] = d
elif matrix [nx ][ny ] == 1 :
go_red (nx ,ny ,x ,y ,iteration )
data [iteration ][2 ] = d
# ๋งจ ์ฒ์ ๋์ ์๊ฐ => ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก (start,end)๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ถ ๊ตฌํด์ค๋ค.
# distance ๊ตฌํด ๋์ ๊ฒ๋ค์ ๋ฒ๋ ค์ผ ํ๋ฏ๋ก so bad
def search (start_point , end_point ):
# ... #
while heap :
dis , location = heapq .heappop (heap )
if location == end_point :
break
for arrive , cost in graph [location ]:
candidate = dis + cost
if candidate < distance [arrive ]:
distance [arrive ] = candidate
heapq .heappush (heap , (distance [arrive ], arrive ))
return distance [end_point ]
# ๋ ์ข์ idea => ์์์ ์ end_point๋ก ํ๋ฉด ๋ฐฐ์ด distance[i]์ ์๋ฏธ๋?
# ๋์ฐฉ์ ์์ i ๋ก ๊ฐ๋ ๊ฑธ๋ฆฌ๋ ๊ฑฐ๋ฆฌ.. ์ฆ ์ฌ ๋์ ๊ฑฐ๋ฆฌ
# graph๋ฅผ ๋ค์ง์ด์ ์ ์ฅํ๋ฉด? distance[i]๋ i์์ end_point๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ.
def search (start_point , graph ):
# ...
while heap :
dis , location = heapq .heappop (heap )
if distance [location ] < dis :
continue
for arrive , cost in graph [location ]:
candidate = dis + cost
if candidate < distance [arrive ]:
distance [arrive ] = candidate
heapq .heappush (heap , (distance [arrive ], arrive ))
return distance
# path๋ start์์ end๋ก ๊ฐ๋์ ๋น์ฉ, reverse๋ end์์ start ๋ก ๊ฐ๋์ ๋น์ฉ
for _ in range (M ):
start , end , cost = map (int ,input ().split ())
path [start ].append ((end ,cost ))
reverse [end ].append ((start ,cost ))
dis = search (end_point ,path )
rev_dis = search (end_point ,reverse )
0805 ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2
# ์ฒ์ ์ ๊ทผ
# ์๋ชป๋ ์ 1. bfs๋ cnt๊ฐ ์ปค์ง๋ ์์๋ก queue์ ๋ด๊ธด๋ค. => visited[nx][ny][k] < cnt ๋ ๋น์ฐํ๋ค.
# ์๋ชป๋ ์ 2. visited์ ๊ฑฐ๋ฆฌ ์ฒดํฌ๋ฅผ ๋์์ ํ๋ฉด queue์ cnt๋ฅผ ๋ด์ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ์ ์๋ค.
visited = [[[- 1 for _ in range (K + 1 )] for _ in range (M )] for _ in range (N )]
def bfs (x_start ,y_start ,x_end ,y_end ):
queue = deque ()
# x์์น, y์์น, ๊ฑฐ๋ฆฌ, ๋ฒฝ๋ซ์ ํ์
queue .append ((x_start ,y_start ,1 ,0 ))
visited [x_start ][y_start ][0 ] = 1
while queue :
x ,y ,cnt ,k = queue .popleft ()
for i in range (4 ):
nx ,ny = x + dx [i ],y + dy [i ]
if iswall (nx ,ny ):
# bfs๋ ์ด์ฐจํผ cnt ์์์ด๋ฏ๋ก ํญ์ visited[nx][ny][k] < cnt ์ด๋ค.
if visited [nx ][ny ][k ] == - 1 or visited [nx ][ny ][k ] > cnt :
if nx == x_end and ny == y_end :
return cnt + 1
if matrix [nx ][ny ] == 1 and k < K :
queue .append ((nx ,ny ,cnt + 1 ,k + 1 ))
visited [nx ][ny ][k + 1 ] = cnt + 1
elif matrix [nx ][ny ] == 0 :
queue .append ((nx ,ny ,cnt + 1 ,k ))
visited [nx ][ny ][k ] = cnt + 1
# ์์ ๋ ์ฝ๋ => ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ ์๋์ง๋ง ์์ฌ์์ฌํจ. visited ๊ตฌ์กฐ๊ฐ ๋น ํจ์จ์ ์ด๋ค.
def bfs (x_start ,y_start ,x_end ,y_end ):
if x_end == 0 and y_end == 0 :
return 1
queue = deque ()
# x์์น, y์์น, ๋ฒฝ๋ซ์ ํ์
queue .append ((x_start ,y_start ,0 ))
visited [x_start ][y_start ][0 ] = 1
while queue :
x ,y ,k = queue .popleft ()
for i in range (4 ):
nx ,ny = x + dx [i ],y + dy [i ]
if iswall (nx ,ny ):
if visited [nx ][ny ][k ] == - 1 :
if nx == x_end and ny == y_end :
return visited [x ][y ][k ]+ 1
if matrix [nx ][ny ] == 1 and k < K :
queue .append ((nx ,ny ,k + 1 ))
# visited์ ๋ฐ๋ก ๊ฑฐ๋ฆฌ ์ฒดํฌ
visited [nx ][ny ][k + 1 ] = visited [x ][y ][k ]+ 1
elif matrix [nx ][ny ] == 0 :
queue .append ((nx ,ny ,k ))
visited [nx ][ny ][k ] = visited [x ][y ][k ]+ 1
# ๋นํธ ๋ง์คํน์ ํ์ฉํ๋ฉด N X M X K ๋งํผ์ visited ๋ฉ๋ชจ๋ฆฌ๋ฅผ N X M ๋งํผ๋ง ์ฌ์ฉํ๋ฉด ๋๋ค.
# ๋นํธ ๋ง์คํน ํ์ฉ? => ๊ฐ ์ํ๋ณ visited ์ฒดํฌ๋ง ํ ๋, ์ฆ ์ํ๋ณ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋.
# K ๋งํผ ๋ฒฝ ๋ซ์ ๊ฒ visited ๊ฒ์ฌ
if visited [nx ][ny ] & (1 << k ):
# K ๋งํผ ๋ฒฝ ๋ซ์ ๊ฒ visited ์
๋ ฅ
visited [nx ][ny ] = visited [nx ][ny ] | (1 << k )
0805 ๊ตฐ๋ ํ์ถ (good)
# ๊ตฌํ ์์ด๋์ด : visited๋ก ํต๊ณผ ํ์ ๋์ ์ต์๊ฐ๊ณผ ํต๊ณผ ํ์ง ์์์ ๋์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
# ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2์ ๋ค๋ฅธ์ ์? => ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2๋ ๊ตฌํ๊ณ ์ ํ๋ ๊ฐ์ด ๊ฑฐ๋ฆฌ
# ์ด์ฐจํผ ๊ฑฐ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฒ์ ๋ง๋๋ ๊ฐ์ด ๊ณง ์ต์๊ฐ
# ํ์ง๋ง ๊ตฐ๋ ํ์ถ์ ๊ฑฐ๋ฆฌ๊ฐ ์๋ ๋ค๋ฅธ value ์ด๋ฏ๋ก ์ฒดํฌ๋ง ํ๋ ๊ฒ์ด ์๋ ์ต์๊ฐ ์ ์ฅํ๊ณ
# ๊ทธ๋ณด๋ค ์์ ๊ฐ๋ง ์ฒดํฌํด์ผํจ
# ํ๋ฆฐ ์ :
visited = [[[987654321 ,987654321 ] for _ in range (M )] for _ in range (N )]
# ๊ฐ ๊ฐ k ๊ฐ 0 <= k <= 10^9 ์ด์๋๋ฐ, 987654321 ๋ณด๋ค 10^9 ์ด ์ปค์ ์ ๋ต์ด ์๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์์์. ๊ฐ์ ์ฒดํฌ ํ๊ฑฐ๋ ์์ float('INF')๋ก ํด๋ ์ข์
visited = [[[9876543210 ,9876543210 ] for _ in range (M )] for _ in range (N )]
# ํต์ฌ ๋ก์ง
while queue :
# x ์์น, y ์์น, ์ง๋์จ ๊ฒฝ๋ก ์ค ์ต๋๊ฐ, ํต๊ณผ ์ฌ๋ถ
x ,y ,val ,k = queue .popleft ()
for i in range (4 ):
nx ,ny = x + dx [i ],y + dy [i ]
if iswall (nx ,ny ):
# ์ด๋๊น์ง์ ์ต๋๊ฐ๊ณผ ์๋ก ๊ฐ ๊ณณ์ ๊ฐ ๋น๊ตํด์ ์ต๋๊ฐ ๊ฐฑ์
temp = max (val ,matrix [nx ][ny ])
# ๊ทธ ์ต๋๊ฐ์ด ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ๋ก์ ์ต๋๊ฐ๋ณด๋ค ํฌ๋ฉด cut
if visited [nx ][ny ][k ] > temp :
queue .append ((nx ,ny ,temp ,k ))
visited [nx ][ny ][k ] = temp
# ํต๊ณผ ํด๋ณด์ง ๋ชปํ์ผ๋ฉด ์๋ ๋ฐฉํฅ์ผ๋ก ํต๊ณผํด๋ณด๊ณ ๊ณผ๊ฑฐ์ ๊ฐ๋ณด๋ค ํฌ๋ฉด cut
# ์ฒ์์๋ visited[nx][ny][k] > temp ์ฌ์ผ๋ง ์ด ๋ถ๊ธฐ๋ฅผ ๊ฒ์ฌํ๋๋ฐ,
# ๊ทธ๋ฌ๋ฉด ํ๋ฆผ why? visited[nx][ny][k] > temp๋ฅผ ์ฑ๋ฆฝํ์ง ์์๋ ๊ฑด๋๋ฐ์ด์ ์ต์๊ฐ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ
if k == 0 :
nnx ,nny = nx + dx [i ],ny + dy [i ]
if iswall (nnx ,nny ):
temp = max (val ,matrix [nnx ][nny ])
if visited [nnx ][nny ][1 ] > temp : queue .append ((nnx ,nny ,temp ,1 ))
visited [nnx ][nny ][1 ] = temp
# ํ๋ฆฐ ์์
# 1. ๋น์ฐํ ๋ถ์ ํ๋๋ผ๊ณ ์๊ฐํ๋ค. ๋ถ์ด ์ฌ๋ฌ๊ฐ ์ผ ์ ์๊ณ ํ๋์ผ ์๋ ์๋ค.
# 2. ๊ฐ์ฅ์๋ฆฌ๋ผ๊ณ ํด์ ๋น์ฐํ x,y ๊ฐ N-1, M-1 ์ผ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋๋ฐ 0์ผ ๊ฒฝ์ฐ๋ ์์๋ค.
# 3. ๋ถ์ ์ฎ๊ธฐ๊ณ ๋๋ฉด ์๋ ์๋ ๋ถ์ QUEUE์์ ๋๊ฐ์ผํ๋๋ฐ ๊ทธ๋ฅ FOR๋ฌธ ๋๋ ค์ ๋ฉ๋ชจ๋ฆฌ ์ด ๊ณผ๊ฐ ๋ฌ์๋ค.
# 4. ๋ถ ๋จผ์ ์ฎ๊ธฐ๊ณ ์ฌ๋ ์ฎ๊ธฐ๋๋ฐ, cnt๊ฐ ๋ฐ๋๋ฉด ๋ถ์ ์ฎ๊ฒจ์ผ ํ๋ค. ๊ทธ๋ผ ์ฒ์ ์์ํ ๋ cnt = 0 ์ผ ๋๋ถํฐ ๋ถ์ ์ฎ๊ฒจ์ผ ํจ.
# ์ฒ์ ๊ตฌํ ํ์ ๋ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ ์ด์ ?
# ์ถ์ธก => ํ๋ ฌ์ ๊ณ์ ๋ณต์ฌํด์ ๊ทธ๋ด๊ฒ์ด๋ค.
new = [[[0 ,0 ,0 ] for _ in range (C )] for _ in range (R )]
for i in range (R ):
for j in range (C ):
if matrix [i ][j ][2 ] != 0 :
s ,d ,z = matrix [i ][j ]
sharkmoving (i ,j ,s ,d ,z )
matrix = new
# ํ๋ ฌ ๋ณต์ฌ ์์ด ํ๋ ์์ด๋์ด ๊ตฌ์ => ๊ธฐ์กด matrix ํ๋ ฌ์ ๋ณํ
# ํ๋ ฌ ๋ณต์ฌํ๋ ์ด์ ๋ ์์ง์ธ ๋ฌผ๊ณ ๊ธฐ์ ์์ง์ฌ์ผ ํ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํจ.
# matrix๋ฅผ 2๊ฐ๋ก ์ชผ๊ฐ์ col์ด ์ง์ ์ผ๋๋ ์ง์ ์ถ๋ฐ ํ์ ๋์ฐฉ, ๊ทธ ๋ฐ๋๋ ๋ฐ๋๋ก ํจ
# ํ์ง๋ง ๋ณ ์๊ฐ ์ฐจ์ด ์์
matrix = [[[[0 ,0 ,0 ],[0 ,0 ,0 ]] for _ in range (C )] for _ in range (R )]
for col in range (C ):
result = fishing (col ,result ,col )
for i in range (R ):
for j in range (C ):
if matrix [i ][j ][col % 2 ][2 ] != 0 :
s ,d ,z = matrix [i ][j ][col % 2 ]
sharkmoving (i ,j ,s ,d ,z ,col )
# ์์ธ: ๋ฒฝ์ ๋ง๋ ๊ฒ ์ฒดํฌํ๊ธฐ ์ํด s๋งํผ for๋ฌธ ๋๋ ค ์ผ์ผํ ์ฒดํฌ ํด์ค -> ์๊ฐ ๊ฑธ๋ฆผ
# for๋ฌธ์ ํ์๋ฅผ ์ค์ฌ์ผํจ
def sharkmoving (x ,y ,s ,d ,z ,col ):
matrix [x ][y ][col % 2 ] = [0 ,0 ,0 ]
for i in range (s ):
nx ,ny = x + dx [d ], y + dy [d ]
if not iswall (nx ,ny ):
if d == 1 : d = 2
elif d == 2 : d = 1
elif d == 3 : d = 4
elif d == 4 : d = 3
nx ,ny = x + dx [d ],y + dy [d ]
x ,y = nx ,ny
if matrix [x ][y ][(col + 1 )% 2 ][2 ] < z :
matrix [x ][y ][(col + 1 )% 2 ][0 ],matrix [x ][y ][(col + 1 )% 2 ][1 ],matrix [x ]
# s๋งํผ ๋์ง ๋ง๊ณ ์์์ ์ผ๋ก ๊ณ์ฐํด์ผ ํจ
def sharkmoving (x ,y ,s ,d ,z ):
matrix [x ][y ] = [0 ,0 ,0 ]
s_start = s
while True :
nx ,ny = x + s * dx [d ], y + s * dy [d ]
if nx < 0 :
s = s - x
x , d = 0 ,2
elif nx >= R :
s = s - (R - 1 - x )
x , d = R - 1 ,1
elif ny < 0 :
s = s - y
y , d = 0 ,3
elif ny >= C :
s = s - (C - 1 - y )
y , d = C - 1 ,4
else :
break
if new [nx ][ny ][2 ] < z :
# s_start์ ์๋ฏธ? => ๋ฐฉํฅ์ ๋ฒฝ์ ๋ถ๋ชํ๋ฉด ๋ฐ๋์ง๋ง s๋ ์ฒ์ ๊ฐ์ด ๋ค์ด๊ฐ์ผํจ
new [nx ][ny ][0 ],new [nx ][ny ][1 ],new [nx ][ny ][2 ] = s_start ,d ,z
# greedy ์๊ณ ๋ฆฌ์ฆ -> ํ์ํ ๊ฒ๋ง ๊ณ์ฐํ๋ฉด ๋๋ค. ํ์ํ ๊ฒ๊ณผ ์๋ ๊ฒ์ ๊ตฌ๋ถํ์.
# ๋๋ถ๋ถ์ ์์ ๋ถํฐ ๋ ๊น์ง ๊ณ์ฐํ๋ ๊ฒ์ด ์๋, ๋์์ ์์์ ์ ์ฐพ์๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค.
# ์์์ ๋ถํฐ ํ๋ํ๋ ๊ณ์ฐํ๋ฉด 100% ์๊ฐ์ด๊ณผ. ํ์ํ ๊ฒ๋ง ์์์ ์ผ๋ก ๊ณ์ฐํด์ผํจ.
# ์ด ๋ฌธ์ ์์ ํ์ํ ๊ฒ? -> ์ต๋ ์ปต๋ผ๋ฉด ์ ๋ง ์๋ฉด ๋๋ค.
# ํ์์๋ ๊ฒ? -> ๋ช ๋ฒ์งธ ์์์ ๋ญ๋ฅผ ํ์๋์ง๋ ์ค์ํ์ง ์๋ค!
# ์ค๊ณ -> ๊ฐ ๋ฐ๋๋ผ์ธ ๊น์ง์ ํด์ผ ํ๋ ์ผ์ ๋ชจ์๋ค.
data = [[] for _ in range (N + 1 )]
for i in range (N ):
a ,b = map (int ,input ().split ())
data [a ].append (b )
# ๊ทธ ๋ค์ ๊ฐ ๋ฐ๋๋ผ์ธ ๋ณ๋ก ์ปต๋ผ๋ฉด ๊ฐฏ์์ ๋ฐ๋ผ ์ ๋ ฌํ๋ค.
for i in range (N ):
if len (data [i ]):
data [i ].sort (reverse = True )
# ๊ฐ ๋ฐ๋๋ผ์ธ ๋ณ๋ก ๊ฐ์ฅ ํฐ ๊ฒ์ ์ ์ฅํ๊ณ ๊ทธ ๋ค์ ์ซ์๋ถํฐ ์ง๊ธ ๊ฐ์ ์ต์๊ฐ์ ๋ฃ๋๋ค.
# ๋ง์ผ ๋ฐ๋๋ผ์ธ ๊น์ง ํด์ผ ํ๋ ์ผ์ด ์๋ค๋ฉด ๋ค์ ๋์ฌ ๋ฐ๋๋ผ์ธ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฃ๊ธฐ ์ํด 0์ ๋ฃ๋๋ค.
heap = []
heapq .heapify (heap )
for i in range (1 ,N + 1 ):
if len (data [i ]) != 0 :
# ์ ์ผ ํฐ ๊ฑฐ ์ถ๊ฐํ๊ณ
heapq .heappush (heap ,data [i ][0 ])
# ๊ทธ๋ค์๊บผ ๋ถํฐ ๋๋๋ฐ, ์ง๊ธ ์๋ ๊ฒ ์ค์ ๊ฐ์ฅ ์์ ๊ฑฐ ๋ณด๋ค ๋ค์๊ป
for j in range (1 ,len (data [i ])):
temp = heapq .heappop (heap )
# ํฌ๋ค? ๊ทธ๋ผ ๋ค์ ๋ฃ๊ณ ๋
if temp > data [i ][j ]:
heapq .heappush (heap ,temp )
break
# ์๋๋ค? ๊ทธ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋ค์
else :
heapq .heappush (heap ,data [i ][j ])
else :
heapq .heappush (heap ,0 )
# ๊ฐ์ฅ greedy ๊ฐ์ด ํผ ์ฝ๋
pq = []
result = 0
# greedy ๋ต๊ฒ ๋ฐ๋๋ผ์ธ์ ์ญ์๋ถํฐ ์์ํ๋ค.
# ์ฝ๊ฒ ์๊ฐํ๋ฉด ๋ฐ๋๋ผ์ธ ์ญ์๋ถํฐ ๋๋ฉด์ ๋ชจ๋ ํ๋ณด๋ฅผ ์ง์ด ๋ฃ๋๋ค
# -> ์ญ์๋ถํฐ ํ๊ธฐ ๋๋ฌธ์ ๋ชปํ๋ ๊ฑด ๋ค์ด๊ฐ ์์ง ์๋ค.
# -> ์ด ๋ฐ๋๋ผ์ธ๋ ํ ์ ์๋ ๋ชจ๋ ์ผ์ ์์ ์ด๋ค. ๊ทธ์ค ์ต๋๊ฐ ๋ฝ์์ result์ ๋ํจ
for i in range (max_dead , 0 , - 1 ):
for j in dead_list [i ]:
heapq .heappush (pq , - j )
if pq :
result -= heapq .heappop (pq )
0809 ๋ฐฑ์ค ๊ณ์ฐ๊ธฐ (๋ค์ ํ์ด๋ณด์)
# ์ญ์ greedy ๋ฌธ์
# 1. ๊ตฌํ ๊ฒ์ ์ ํํ๊ฒ ํ์
ํ๋ค.
# -> ์ฐ์ฐ ์์.
# 2. ์ญ์๋ถํฐ ์์ํ๋ค.
# -> 0๋ถํฐ ํ๋ฉด ํท๊ฐ๋ฆฐ๋ค. N ๋ถํฐ ์ซ์๋ฅผ ์ค์ฌ๋๊ฐ์ผ ํ๋ค.
# 3. ํ์ํ ๊ฒ๋ง ์์์ ์ผ๋ก ๊ณ์ฐํด์ผ ํ๋ค.(for๋ฌธ์ผ๋ก ํ์ํ์ํ๋ฉด ํฐ์ง)
# -> ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ง์ ๋๋ฆฌ๋ฉด ์๊ฐ์ด๊ณผ ๋๋ค. ํ์ํ ์ฐ์ฐ๋ง ํด์ ๊ฐ์ง์๋ฅผ ์ค์ฌ์ผํ๋ค.
N = int (input ())
result = []
# 100000 ๊ผด๋ก ๋ง๋ค์ด ์ค์ผ ํจ.
while True :
# N & 1 = 1 : ๋์๋ฆฌ๊ฐ 1์ด๋ค -> ํ์๋ค ๋ชป๋ง๋ค๊ธฐ ๋๋ฌธ์ *2
if N & 1 :
result += ['[/]' ]
N = N * 2
# N & 2 = 1: ๋ค์์ ๋๋ฒ์งธ ์๋ฆฌ๊ฐ 1์ด๋ค -> ์์ ์ค๋ค.
elif N & 2 :
result += ['[+]' ]
N = N - 2
# N = N //2 ๋ฅผ ์ด์ง์ ์ธก๋ฉด์์ ๋ณด๋ฉด ๋งจ ๋ท์๋ฆฌ๋ฅผ ์์ ์ค๋ค.
# ํ์ง๋ง N์ด ์ง์ ์ผ๋๋ง ๋ง์กฑํ๋ ๊ฒฝ์ฐ๋ค.
else :
result = result + ['[*]' ]
N = N // 2
if N == 0 :
break
print (len (result ))
print (* result [::- 1 ])
0812 ๋ฐฑ์ค ํค vs ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค ๊ฐ์
# ๋ ๋ฌธ์ ์ ์ฐจ์ด์ ์ด ๋ญ๊น?
# ํค -> ์ฃผ์ด ๋ฌธ์์ ๊ฐฏ์ ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค ๊ฐ์ -> ์ต๋จ๊ฑฐ๋ฆฌ
# ์ต๋จ๊ฑฐ๋ฆฌ๋ ๋นํธ๋ง์คํน์ด ํ์ํ๊ณ , ๊ทธ๊ฒ ์๋๋ฉด ๊ผญ ์ธํ์์๋ค.(๊ฐ์ ์๋์ง ์๋์ง๋ง ์์)
# ๊ฒฝ๋ก๊ฐ ์ค์ํ๋ค -> ๋นํธ๋ง์คํน์ผ๋ก ์ด์ ์ฃผ์ธ๋ ๋ง๋ค ์ด๊ธฐํ
# ๊ฒฝ๋ก ํ์์๊ณ ๊ฐ์ ์๋ ์๋๋ง ์ค์ -> visited 1์ฐจ์์ผ๋ก ํ๋ฒ๋ง ๋์
# ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค ๊ฐ์ -> ์ต๋จ๊ฑฐ๋ฆฌ ์ด๋ฏ๋ก ์ด์ ์ฃผ์ธ ๋ ๋ง๋ค visited ์ด๊ธฐํ ํด์
# ์์ง์ด๋๊ฑฐ ์ฒดํฌ ํด์ค์ผ ํจ
# visited[x][y] | (1<<cnt) ๋ฐฉ๋ฌธ์ ์ฒดํฌ : cnt -> ์ฃผ์ด ์ด์ ๊ฐฏ์
# cnt๊ฐ ์ฆ๊ฐ ํ ์๋ก ๋ฐ๋ฆฌ๋ ๊ฐฏ์๊ฐ ๋์ด visited๊ฐ ์ด๊ธฐํ ํ๋ ํจ๊ณผ
# ํค๋ 6๊ฐ -> 0~31๋ก ๊ฐ๊ฐ์ ํค ๋ณด์ ์ํฉ์ ์ฒดํฌ ๊ฐ๋ฅํ๋ค.
# ex) key = 27 => 011011 (1,2,4,5๋ฒ ์ด์ ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค.)
# ex) if visited[x][y] == 27 ํ๋ฉด (1,2,4,5๋ฒ ์ด์ ๋ฅผ ๋ณด์ ํ ์ํ์ผ๋ ๋ฐฉ๋ฌธํ๋๊ฐ?)
# ํค -> ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ visited๋ฅผ ์ด๊ธฐํ ํด์ค ํ์ ์๋ค.
# visited๋ฅผ ์ด๊ธฐํ ํ ํ์ ์๋ค? -> ๊ทธ๋ฅ ์ด์ ์ฃผ์ฐ๋ฉด ๋์๊ฐ๋ฉด ๋จ,
# ๋ฌธ์ ๋งํ ๋ชป๊ฐ๋ ๊ณณ ์์ผ๋ฉด ๊ฐ๊ณ ์๋๋ฉด ๋ง๊ณ
# ์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํ๋๊ฒ ์๋๊ธฐ ๋๋ฌธ์ ๋นํธ๋ง์คํน ํ ํ์์๋ค.
# ๋ก์ง
# 1. ์
๊ตฌ๋ฅผ ํ๋์ฉ ์์์๊ด์์ด ์
์ฅ
# 2. ๋ฌธ์ ๊ฐ๋๋ฐ ์ด์ ๊ฐ ์์ด์ ๋ชป์ฌ๋ค? -> ๋์๋๋ฆฌ์ ํค์ ์ขํ ์ ์ฅ
# 3. ์ง๋๊ฐ๋ค๊ฐ ์ด์ ๋ฅผ ์ฐพ์๋ค? -> ๊ทธ ๋์๋๋ฆฌ๋ก ๊ฐ์ ๊ทธ ํค์ ์ขํ๋ค queue์ append
# ๋ฌธ ์
์ฅ ์์๋ ์๊ด์๋ ์ด์ -> ๋ชป์ฌ๋ ๋ฌธ์ ์์น ๋ด์๋๊ณ ๋์ค๊ฐ์ ์ด์ ์ฐพ์ผ๋ฉด ๊ฐ๋ฉด ๋๊ณ
# ๊ฐ๋๋ฐ ์ด์ ๊ฐ ์์ผ๋ฉด ๊ทธ๋ฅ ์ด๋ฉด ๋๊ณ ๋๊น์ง ๋ชป์ฃผ์ฐ๋ฉด ๋ชป๊ฐ๋ ์์น์ธ๊ฑฐ๊ณ .
# visited๋ ๋นํธ๋ง์คํน ํ์์๋ ์ด์ -> ์ด์ฐจํผ ๊ฐ์์๋ ์๋๋ง ๋ณด๋๊ฑด๋ฐ ๋ญ. ๊ฒฝ๋ก๊ฐ ์ค์ํ๊ฒ ์๋์์.
# idea -> brute force( ์์ ํ์ )
# ๊ณตํ๋์ฉ ๋๋ฉด์ ์๊ธฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ฅผ ์ ๋ถ ์ผ๋ค.
# ์๊ฐ ๋ณต์ก๋ O(n^2) ์ด๋ฏ๋ก ๋ถ๊ฐ๋ฅ -> log(n) ์ด๋ nlog(n)์ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
# ์ฒซ๋ฒ์งธ idea -> ์ ๋ ฌ ํ ์ซ์๊ฐ ๋ฎ์ ๊ฒ ๋ถํฐ ๋ณธ๋ค.
# ๋ฎ์ ๊ฒ๋ถํฐ ๋ณด๋ฉด์ ๊ทธ๋๊น์ง์ ์ ์ฒด ํฉ์ ๊ตฌํ๊ณ ๋ณธ์ธ์ ์๊น์ ๋บ๋ค.
# ์ ์ํ ์ -> ํฌ๊ธฐ๊ฐ ๊ฐ์ ๊ณต๋ค์ ์ฒ๋ฆฌํด ์ค์ผํจ
N = int (input ())
data = []
for i in range (N ):
color ,size = map (int ,input ().split ())
data .append ([size ,color ,i ])
result = [0 for _ in range (N )]
# ์๊น ๋ณ ํฌ๊ธฐ ํฉ ์ ์ฅ
color_sum = [0 for _ in range (N + 1 )]
# ๋ณผ์ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
data .sort ()
total_sum , now = 0 , 0
for size ,color ,idx in data :
# ๊ฐ์ ํฌ๊ธฐ์ ๋ณผ๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ
if now == size :
# temp๋ฅผ dictionary๋ก ์ ์ํ๋ ์ด์ ?
# dictionary ์ in ํจ์๋ ์๊ฐ๋ณต์ก๋ O(1) ์ด๋ค.
if color in temp :
result [idx ] = val - temp [color ]
else :
result [idx ] = val - color_sum [color ]
temp [color ] = color_sum [color ]
# ๊ฐ์ง ์๊ณ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ฉด ๋ฐ๋
else :
# ์ธ๋ฑ์ค์ ๊ฐ์ ์ด๋๊น์ง ์ง๋์จ ๋ชจ๋ ๊ณต์ ํฌ๊ธฐ ํฉ - ๋ด๊ฐ ์ํ ๋ณผ์ ํฌ๊ธฐ ํฉ
temp = {color :color_sum [color ]}
result [idx ] = total_sum - color_sum [color ]
now , val = size , total_sum
color_sum [color ] += size
total_sum += size
for num in result :
print (num )
# ๋ ์ข์ idea -> ๊ตณ์ด sort๋ฅผ ํด์ผํ๋?
# ๊ณต์ ์ต๋ ๊ฐ์ด ์ ํด์ ธ ์๋ค -> ์
๋ ฅ ๋ฐ์ ๋ ๋ถํฐ ์ ํด์ง ์์น์ ๋ฃ์ผ๋ฉด ์์์ ์ ๋ ฌ๋จ
N = int (input ())
# ๊ณต์ ํฌ๊ธฐ ์์ผ๋ก ๋ชจ์๋
data = [[] for _ in range (2001 )]
for i in range (N ):
color ,size = map (int ,input ().split ())
data [size ].append ((color ,i ))
result = [0 for _ in range (N )]
color_sum = [0 for _ in range (N + 1 )]
total_sum = 0
for size ,arr in enumerate (data ):
temp ,temp_size = {},0
# ๊ฐ ํฌ๊ธฐ๋ง๋ค ๊ณต์ ๊บผ๋ (์๋์ผ๋ก ํฌ๊ธฐ ์์ผ๋ก ๊บผ๋ด์ง)
for color ,idx in arr :
if color in temp :
result [idx ] = total_sum - temp [color ]
else :
result [idx ] = total_sum - color_sum [color ]
temp [color ] = color_sum [color ]
color_sum [color ] += size
temp_size += size
total_sum += temp_size
for num in result :
print (num )
# ์ฒ์ ์ ๊ทผ -> ๊ทธ๋ฅ ์์๋๋ก ์ง์ฐ๊ธฐ.
# ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐ์ง ์ ์๋ค. ์ต์ ์ ํด๋ ์กด์ฌ ํ์ง ์์ผ๋ฏ๋ก Brute Force
# ์ด๋จ๋ Brute Force? -> ๋ฌด์์ด ์ต์ ์ ํด ์ธ์ง ๋๊น์ง ํด๋ด์ผ ์๋ ๊ฒฝ์ฐ.
# ์๋ฅผ ๋ค๋ฉด ์ง๊ธ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ๊ณจ๋๋ค ํ๋๋ผ๊ณ ๋ง์ง๋ง ๊น์ง ๊ฐ์ ๋ ๊ทธ๊ฒ์ด ์ต์ ์ด๋ผ๋
# ๋ณด์ฅ์ด ์๋ค. ๊ทธ ์๊ฐ ์ต์ ์ ๊ณ ๋ฅด๋ฉด -> Greedy Algorithm
# ๋ฌธ์ ํธ๋ ๋ฐฉ๋ฒ -> ํ๋์ฉ ํด๋ด์ผ ํ๋ค. (์ฌ๊ท๋ก)
def solve (matrix ,frequency ):
if sum (frequency ) >= result [0 ]:
return
for i in range (10 ):
for j in range (10 ):
if matrix [i ][j ] == 1 :
# ํฌ๊ธฐ๊ฐ 5์ธ ๊ฒ ๋ถํฐ ์ฒดํฌํด์ ๋๋ฉด ์ถ๋ฐ
# dfs์ ์๋ฆฌ, ๋งจ ์ฒ์ 5๋ถํฐ ์ถ๋ฐํด์ ๋๊น์ง ๊ฐ๋ณด๊ณ ์๋๋ฉด ๋์์ด
# ๋ง์ผ ์ฒ์์ด 5๊ฐ ์๋๋ผ๋ฉด ๊ทธ ๋ค๋ ์ ๋ถ ์๋๋ฏ๋ก ๊ฐ์ง์น๊ธฐ
for k in range (5 ,0 ,- 1 ):
if i < 11 - k and j < 11 - k and frequency [k ] < 5 :
if Check (i , j , 5 ,matrix ):
Make (i , j , 5 , matrix )
frequency [5 ] += 1
solve (deepcopy (matrix ),frequency [:])
frequency [5 ] -= 1
Reverse (i , j , 5 , matrix )
# ๊ฒฝ์ฐ์ ์ ๋ค ํด๋ณด๊ณ ์ด ๊ฐ์ง๋ return
# ๋ง์ผ ์์ for๋ฌธ์์ ๊ฑธ๋ ธ๋ค๋ฉด ๋ค์ ๊ฐ์ง๋ก ๊ฐ์ ๊ฒ์ด๊ณ
# ๋ชป๊ฐ๋ค๋ฉด ๋ ์ด์ ์ ๋งํ์ง ๋ชปํ ๊ฐ์ง.
return
result [0 ] = min (result [0 ],sum (frequency ))
# ์ฒ์ ์ ๊ทผ ์ ์๊ฐ ์ด๊ณผ ์ด์ .
# 1. ํ์ฌ result ๋ณด๋ค ํ ์ํ๊ฐ ํฌ๋ฉด return (๊ฐ์ง์น๊ธฐ) ํด์ผ ํจ.
if sum (frequency ) >= result [0 ]:
return
# 2. deepcopy๊ฐ ํ์์์
if i < 11 - k and j < 11 - k and frequency [k ] < 5 :
if Check (i , j , 5 ,matrix ):
Make (i , j , 5 , matrix )
frequency [5 ] += 1
# ์ด์ฐจํผ ๊ทธ ๋น์์ matrix์ํ๋ก ๋๊น์ง ๊ฐ๊ธฐ ๋๋ฌธ์ deepcopy๋ฅผ ํด์
# ๋๊ฒจ์ค ํ์๊ฐ ์์
# ์ฌ๊ท๋ก permutation ๋ง๋๋ ์๋ฆฌ๋ฅผ ์๊ธฐ ์์ผ๋ณด๊ธฐ ๋ฐ๋.
solve ()
frequency [5 ] -= 1
Reverse (i , j , 5 , matrix )
0822 ์ผ์์ผ ์์นจ์ ๋ฐ์ดํธ
# ์๊ฐ์ ๋น ๋ฅด๊ฒ ํ์ผ๋ ๊ตฌํ ๊ณผ์ ์์ ๋ํ
์ผ์ด ๋ถ์กฑํด์ ์๊ฐ์ ๋ญ๋นํจ
def bfs (x ,y ):
queue = deque ()
queue .append ((x ,y ,[0 ,0 ]))
visited [x ][y ] = [0 ,0 ]
while queue :
x , y , step = queue .popleft ()
for i in range (4 ):
nx ,ny = x + dx [i ],y + dy [i ]
if iswall (nx ,ny ):
temp = step [:]
# ์ด์ ์ ์กฐ๊ฑด์ผ๋ก ๋จผ์ ๊ฒ์ฌํ๊ณ ๊ทธ ๋ค์ temp ๋ณ๊ฒฝ -> ์ผ๊ด์ ์ผ๋ก ๊ฒ์ฌ๋์ง ๋ชปํจ
# ์? ์ด์ ์๋ ์กฐ๊ฑด์ ๋ง์๋๋ฐ ๋ฐ๋๊ณ ๋๋ฉด ์กฐ๊ฑด์ ์๋ง์ผ๊ณ ์ค์ง์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฒ์ ์กฐ๊ฑด์ ์๋ง๋ ๊ฒ๋ค
# ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋ ๊ฐ์ผ๋ก ์กฐ๊ฑด ๊ฒ์ฌ๋ฅผ ํ๊ณ ๋ง์ผ๋ฉด ์ถ๊ฐ ์ด๋ฐ์์ผ๋ก ํด์ผํจ
if visited [nx ][ny ][0 ] > step [0 ] or (visited [nx ][ny ][0 ] == step [0 ] and visited [nx ][ny ][1 ] > step [1 ]):
if matrix [nx ][ny ] == 'F' :
visited [nx ][ny ] = temp
continue
elif matrix [nx ][ny ] == 'a' :
temp [1 ] += 1
elif matrix [nx ][ny ] == 'g' :
temp [0 ] += 1
queue .append ((nx , ny , temp ))
visited [nx ][ny ] = temp
# ๋ฌด์์ด ํ๋ ธ์๊น? -> 'a'๋ฅผ ์ง๋๋ ๊ฒฝ์ฐ์ 'g'๋ฅผ ์ง๋๋ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ง๋๋ ๊ฒฝ์ฐ ๋ชจ๋ visited๊ฐ ๊ฐฑ์ ๋๋ ์กฐ๊ฑด์ด ๋ค๋ฅด๋ค
# if visited[nx][ny][0] > step[0] or (visited[nx][ny][0] == step[0] and visited[nx][ny][1] > step[1]):
# ์ด๋ ๊ฒ ํต์ผ๋ ์กฐ๊ฑด์ ๊ฒ์ฌํ๊ณ ํต๊ณผํ๋ฉด temp๊ฐ +1 ์ด๋ฐ์์ผ๋ก ๋๋๋ฐ, ๊ทธ๋ ๊ฒ ๋๋ฉด ์ ๋๋ก visited๊ฐ ์ฒดํฌ๋์ง ์๋๋ค
def bfs (x ,y ):
queue = deque ()
queue .append ((x ,y ,[0 ,0 ]))
visited [x ][y ] = [0 ,0 ]
while queue :
x , y , step = queue .popleft ()
for i in range (4 ):
nx ,ny = x + dx [i ],y + dy [i ]
if iswall (nx ,ny ):
temp = step [:]
if matrix [nx ][ny ] == 'F' :
if visited [nx ][ny ][0 ] > step [0 ] or (visited [nx ][ny ][0 ] == step [0 ] and visited [nx ][ny ][1 ] > step [1 ]):
visited [nx ][ny ] = temp
continue
# ์กฐ๊ฑด์ ์ํด ๋จผ์ ๋ณ๊ฒฝํ๊ณ
elif matrix [nx ][ny ] == 'a' :
temp [1 ] += 1
elif matrix [nx ][ny ] == 'g' :
temp [0 ] += 1
# ๊ทธ ๋ณ๊ฒฝ๋ ๊ฐ์ผ๋ก ์กฐ๊ฑด ๊ฒ์ฌ ํด์ ๋ง์ผ๋ฉด ์ถ๊ฐ
if visited [nx ][ny ][0 ] > temp [0 ] or (visited [nx ][ny ][0 ] == temp [0 ] and visited [nx ][ny ][1 ] > temp [1 ]):
queue .append ((nx , ny , temp ))
visited [nx ][ny ] = temp
# ํญ์ ์กฐ๊ฑด ๊ฒ์ฌํ ๋ ๋ณ๊ฒฝ์ฌํญ์ด ์๋ค๋ฉด ๋ณ๊ฒฝ -> ์กฐ๊ฑด ๊ฒ์ฌ ํ vistited ์ queue/stack ๋ณ๊ฒฝ ์ด์์!!!
# ์ฆ ๋ค์๋งํด ๋ณ๊ฒฝ๋ ์กฐ๊ฑด์ผ๋ก ์ฒดํฌ๋ฅผ ํด์ผ ํ๋ค๋ฉด, ๋จผ์ ๋ณ๊ฒฝ์ ํด๋ณธ ํ ์กฐ๊ฑด ๊ฒ์ฌ ํด์ผ ํ๋ค.
0823 ํผ๋ฆฌ๋ถ๋ ์ฌ๋์ด
# ์ฒ์ ์ ๊ทผ -> ๊ทธ๋ฅ ํ๋์ฉ ๋์์ ๋๋ ์๊ธฐ๋ค ๋ผ๋ฆฌ ๋๋ ๊ฒ ๋งํผ ์ซ์ ์ฌ๋ ค์ค (์ค๋ต)
# ์๋? ์ถ๋ฐ์ ์์ ์ ์ด์ด์ง์ง๋ง ๋ค์์ ์ด์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์์
def bfs (x ,y ,cnt ):
queue = deque ()
queue .append ((x ,y ,[[x ,y ]]))
visited [x ][y ] = cnt
while queue :
x ,y ,step = queue .popleft ()
dx ,dy = direction [matrix [x ][y ]]
nx ,ny = x + dx , y + dy
# ์๋ค๋ฆฐ ์ ์ด ์์ผ๋ฉด ๋ด๊ฑธ๋ก ๋ง๋ค๊ณ
if visited [nx ][ny ] == 0 :
queue .append ((nx ,ny ,step + [[nx ,ny ]]))
visited [nx ][ny ] = cnt
# ๋ด ์ ์ด๋ ์ด์ด์ง๋ค? -> circular ํ๋ค๋ ๊ฑฐ๋๊น ๋ด ์ํ
elif visited [nx ][ny ] == visited [x ][y ]:
result [0 ] += 1
return cnt + 1
# ๋ค๋ฅธ ์ ์ด๋ ๋ง๋ฌ๋ค? -> ๋๋ ๊ทธ ์ํ ์ ์์์ด์๋ค
elif visited [nx ][ny ] != visited [x ][y ]:
temp = visited [nx ][ny ]
for x1 ,y1 in step :
visited [x1 ][y1 ] = temp
return cnt + 1
return cnt + 1
# ๋ ์ข์ ๋ฐฉ๋ฒ์ ์๊ฐํด์ผ ํ๋ค. -> step์ผ๋ก ๊ผญ visited๋ฅผ ์ผ์ผํ ๋ฐ๊ฟ์ค ํ์๊ฐ ์์๊น?
# ์ ํํ visited๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ์ ์ํ๋๊ฒ ์๋๋ผ ๋ช๊ฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง๋ง ์๋ฉด ๋๋๋ฐ?
# cnt๊ฐ ์ ์ ์ปค์ง๋ ๊ตฌ์กฐ์ด๋ฏ๋ก visited[nx][ny] < visited[x][y] ์ด๋ฉด ๋ค๋ฅธ graph์ ๋ง๋๋ ๊ฒ์์ ์์ ์๋ค.
# ๋ฐ๋ผ์ visited๋ฅผ ์ ํํ๊ฒ ๋ง์ถฐ์ฃผ์ง ์์๋ ๊ฒฝ๋ก์ ๊ฐฏ์๋ฅผ ๊ตฌํ ์ ์์
def bfs (x ,y ,cnt ):
queue = deque ()
queue .append ((x ,y ))
visited [x ][y ] = cnt
while queue :
x ,y = queue .popleft ()
dx ,dy = direction [matrix [x ][y ]]
nx ,ny = x + dx , y + dy
# ์๋ค๋ฆฐ ์ ์ด ์์ผ๋ฉด ๋ด๊ฑธ๋ก ๋ง๋ค๊ณ
if visited [nx ][ny ] == 0 :
queue .append ((nx ,ny ))
visited [nx ][ny ] = cnt
# ๋ด ์ ์ด๋ ์ด์ด์ง๋ค? -> circular ํ๋ค๋ ๊ฑฐ๋๊น ๋ด ์ํ
elif visited [nx ][ny ] == visited [x ][y ]:
result [0 ] += 1
return cnt + 1
# ๋ค๋ฅธ ์ ์ด๋ ๋ง๋ฌ๋ค? -> ๋๋ ๊ทธ ์ํ ์ ์์์ด์๋ค
elif visited [nx ][ny ] < visited [x ][y ]:
return cnt + 1
return cnt + 1
0827 ํ๋ก๊ทธ๋๋จธ์ค ๋จ์ด ๋ณํ
# ๋ชจ๋ ํ
์คํธ ์ผ์ด์ค๊ฐ ์ ์๋๋ค? -> ๋ฌด์กฐ๊ฑด ๋์ชฝ์ ์๊ฐํด์ผ ํ๋ค.
# ์๋ ๋ ๋ฐ๋์ ์ฒดํฌ ํด์ผ ํ ์ .
# 1. 0์ผ๋ ์ ๋์ค๋๋
# 2. 0์ ์ ์ธํ ์ฒซ ๋ฒ์งธ ์๊ฐ ์ ๋์ค๋๋
# 3. ๋ง์ง๋ง ์ผ์ด์ค๊ฐ ์ ๋ค์ด๊ฐ๋๋
# ๋๋ถ๋ถ์ ์ผ์ด์ค๋ queue์ ๋ด์๋์ ๋์ฌ๋๊ฐ ๋ฌธ์ ๋ค.
# while queue ํ๊ธฐ ์ํด ์ฒ์์ queue๋ฅผ ๋ด๋๋ฐ, ๊ทธ๋ ๋๋๋ฒ๋ฆด์๋ ์๋ค.
# ๊ทธ๋์ queue์ ๋ด์ ๋๋ ์ฒดํฌ๋ฅผ ํด์ค์ผ ํ๋ค.
# ๊ทธ๋ฆฌ๊ณ ๋ณดํต queue ์์์ return ํ ๋๊ฐ ์๋ ๋๋๊ณ ๊ฒฐ๊ณผ ๋ณด๊ณ return ํ๋ ๊ฒฝ์ฐ๊ฐ
# ์๋๋ฐ ๊ทธ๋๋ ํ๋ฒ ๋ ์ฒดํฌํด์ฃผ๊ณ return ํด์ผ ํ๋ค.
from _collections import deque
def solution (begin , target , words ):
queue = deque ()
for word in words :
if isword (begin ,word ):
# ์ด๊ฑธ ๊ณ ๋ ค์ํด์ ํ๋ฆผ
# while queue ๋๊ธฐ ์ ์ ๋๋๋ ๊ฒฝ์ฐ ( 0์ ์ ์ธํ ์ฒซ ๋ฒ์งธ ์)
# ์ด๊ฑธ ํญ์ ๊ณ ๋ คํด ์ค์ผ ํ๋ค.
if word == target :
return 1
else :
queue .append ((word ,[word ]))
while queue :
print (queue )
now , step = queue .popleft ()
for word in words :
if word not in step and isword (now ,word ):
if word == target :
return len (step )+ 1
else :
queue .append ((word ,step + [word ]))
return 0
def isword (now ,word ):
cnt = 0
for idx ,alpha in enumerate (word ):
if alpha != now [idx ]:
cnt += 1
if cnt == 1 :
return True
else :
return False
0911 ๋ชจ๋์ฑ (very good)
# N = 1000 ์ด๊ธฐ ๋๋ฌธ์ ์ ๋งํ๋ฉด N * N ์ผ๋ก ํ๋ฒ ๋์์ผํจ.
# ๋ฌด์กฐ๊ฑด bfs 1๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ค๋ ์๋ฏธ.
# ์ด๋ป๊ฒ๋ bfs ํ๋ฒ์ผ๋ก ๋์์ ํ์ ์์ผ๋๊น ๊ทธ๋ ๊ฒ ํ๋ ค๋ ์์ด๋์ด๋ฅผ ๋ด์ผํ๋ค.
# ์ํ๋ฆด๋๋ ๋ฌด์กฐ๊ฑด ๋ฐ๋๋ก ์๊ฐํด ๋ด์ผํ๋ค.
# 1. 0์์ ๋ํ๋ ๊ฑฐ ๋์ ์ ์ฒด์์ ๋นผ๋๊ฑฐ
# 2. ๋ชจ๋์ ์์ ์ด ์๋ ๋ฌผ์ ์์ ์์ ๋ณด๋ ๊ฒ
# ๋งจ ์ฒ์ ์ฝ๋
# queue์ ๋จ๊ณ๋ฅผ ๋๋ ์ ํธ๋ ๋ฌธ์
# ์ด์ฐจํผ queue๊ฐ ๋ด๊ธฐ๋๊ฒ ์๊ณ ์์ผ๋ฉด return
from _collections import deque
def iswall (x ,y ):
if x < 0 or y < 0 : return False
elif x >= N or y >= M : return False
else : return True
def init ():
queue ,next = deque (), deque ()
for i in range (N ):
for j in range (M ):
if matrix [i ][j ] == 0 and not visited [i ][j ]:
queue .append ((i ,j ))
visited [i ][j ] = 1
while queue :
x ,y = queue .popleft ()
for k in range (8 ):
nx ,ny = x + dx [k ],y + dy [k ]
if iswall (nx ,ny ):
if matrix [nx ][ny ] != 0 :
matrix [nx ][ny ] -= 1
if matrix [nx ][ny ] == 0 :
next .append ((nx ,ny ))
visited [nx ][ny ] = 1
elif not visited [nx ][ny ]:
queue .append ((nx ,ny ))
visited [nx ][ny ] = 1
return next
def solve (queue ):
next = deque ()
while queue :
x , y = queue .popleft ()
for k in range (8 ):
nx , ny = x + dx [k ], y + dy [k ]
if iswall (nx , ny ):
if matrix [nx ][ny ] != 0 :
matrix [nx ][ny ] -= 1
if matrix [nx ][ny ] == 0 :
next .append ((nx , ny ))
visited [nx ][ny ] = 1
return next
global N ,M
N , M = map (int ,input ().split ())
# 1~9์ ์ซ์ ํน์ '.' ๋น ๋ชจ๋
matrix = []
for i in range (N ):
temp = list (input ())
for j in range (M ):
if temp [j ] == '.' :
temp [j ] = 0
else :
temp [j ] = int (temp [j ])
matrix .append (temp )
visited = [[0 for _ in range (M )] for _ in range (N )]
# ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋์
dx = [- 1 ,- 1 ,0 ,1 ,1 ,1 ,0 ,- 1 ]
dy = [0 ,1 ,1 ,1 ,0 ,- 1 ,- 1 ,- 1 ]
next = init ()
result = 0
while next :
result += 1
next = solve (next )
print (result )