[BOJ][๐ก3][๋ฐฑ์ค#26009] ํ๋ํ ๋ฑ๊ตฃ๊ธธ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
ํตํ๋ฌ ์ฌํ์ด๋ 1๊ต์ ์์ ์ ๋ฃ๊ธฐ ์ํด ์์นจ ์ผ์ฐ ํ๊ต์ ๊ฐ๋ ค๊ณ ํ๋ค. ์ฌํ์ด๊ฐ ์ฌ๋ ์ง์ญ์ ํฌ๊ธฐ๊ฐ $N \times M$ ์ธ ๊ฒฉ์๋ก ๋ํ๋ผ ์ ์๋๋ฐ, $i$ํ $j$์ด์ ํด๋นํ๋ ์นธ์ $(i, j)$๋ก ๋ํ๋ผ ๋ ์ฌํ์ด๋ ํ์ฌ $(1, 1)$์, ํ๊ต๋ $(N, M)$์ ์์นํด ์๋ค. ์ฌํ์ด๋ ์ํ์ข์ฐ๋ก ํ ์นธ์ฉ ์ด๋ํ ์ ์๊ณ ์ง์ญ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ ์๋ ์๋ค. ๋ฑ๊ตฃ๊ธธ์ ์ํ์น๋ง์ ์์๋ฐ, ์ด ์ง์ญ์๋ $K$๊ฐ์ ์ ์ฒด ๊ตฌ์ญ์ด ์๋ค. $i$๋ฒ์งธ ์ ์ฒด ๊ตฌ์ญ์ ์ธ ์ ์ $R_i, C_i, D_i$๋ก ํํ๋๋ฉฐ, ์ด๋ $(R_i, C_i)$๋ก๋ถํฐ ๊ฑฐ๋ฆฌ๊ฐ $D_i$ ์ดํ์ธ ์นธ๋ค์๋ ๊ทน์ฌํ ๊ตํต ์ ์ฒด๊ฐ ์ผ์ด๋๊ณ ์์์ ์๋ฏธํ๋ค. ๋ ์นธ $(R_1, C_1), (R_2, C_2)$ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ $|R_1 - R_2| + |C_1 - C_2|$์ ๊ฐ๋ค. ์ฌํ์ด๋ ๊ตํต ์ ์ฒด๊ฐ ์ผ์ด๋๊ณ ์๋ ์นธ์ ๋ฐฉ๋ฌธํ๋ฉด ์์ ์ ์ง๊ฐํ๊ฒ ๋๋ฉฐ, ๋ฐฉ๋ฌธํ์ง ์๋๋ค๋ฉด ์ง๊ฐํ์ง ์๊ณ ๋ฌด์ฌํ ์์ ์ ๋ค์ ์ ์๋ค. $K$๊ฐ์ ์ ์ฒด ๊ตฌ์ญ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋ ์ฌํ์ด๊ฐ ์ง๊ฐํ์ง ์๊ณ 1๊ต์ ์์ ์ ๋ค์ ์ ์์์ง ์์๋ณด์. ๋ํ ์ฌํ์ด๋ ์ต๋ํ ์ผ์ฐ ํ๊ต์ ๋์ฐฉํ๋ ค ํ๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ์ฌํ์ด๊ฐ ์ง๊ฐํ์ง ์๊ณ ์์ ์ ๋ค์ ์ ์๋ค๋ฉด ์ต์ ๋ช ๋ฒ์ ์ด๋์ผ๋ก ์์ ์ ๋ค์ผ๋ฌ ๊ฐ ์ ์๋์ง๋ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒฉ์์ ํฌ๊ธฐ $N, M$์ด ์ฃผ์ด์ง๋ค. $(2 \le N, M \le 3\ 000)$ ๋ค์ ์ค์ ์ ์ฒด ๊ตฌ์ญ์ ์ $K$๊ฐ ์ฃผ์ด์ง๋ค. $(1 \le K \le 3\ 000)$ ๋ค์ $K$๊ฐ ์ค์ ๊ฑธ์ณ ๊ฐ ์ ์ฒด ๊ตฌ์ญ์ ์ ๋ณด $R_i, C_i, D_i$๊ฐ ์ฃผ์ด์ง๋ค. $(1 \le R_i \le N, 1 \le C_i \le M, 0 \le D_i \le 3\ 000)$ $(1, 1)$ ๋๋ $(N, M)$์ ๊ตํต ์ ์ฒด๊ฐ ์ผ์ด๋๊ณ ์๋ ๊ฒฝ์ฐ๋ ์ฃผ์ด์ง์ง ์๋๋ค.
์ถ๋ ฅ
์ฌํ์ด๊ฐ ์ง๊ฐํ์ง ์๊ณ ์์ ์ ๋ค์ ์ ์์ผ๋ฉด YES๋ฅผ ์ถ๋ ฅํ๊ณ , ๋ค์ ์ค์ ์ต์ ์ด๋ ํ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ์ง๊ฐํ์ง ์๊ณ ์์ ์ ๋ค์ ์ ์๋ค๋ฉด NO๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
5 5
2
4 2 1
2 4 0
์ถ๋ ฅ
YES
8
์์ 2
์ ๋ ฅ
5 5
2
4 2 1
2 4 1
์ถ๋ ฅ
NO
์์ 3
์ ๋ ฅ
4 7
3
1 3 0
1 3 1
4 5 1
์ถ๋ ฅ
YES
11
My Sol
import sys
input = sys.stdin.readline
from collections import deque
def main():
global mat, I, J
# N๋ฒ๋์ ์ฐจ ํ์ธ
for _ in range(N):
if not check_main(): return False
# BFS
Q = deque([(0,0)])
mat[0][0] = 1
while Q:
ni, nj = Q.popleft()
for di, dj in ((1,0),(0,1),(-1,0),(0,-1)):
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
if mat[si][sj]: continue
mat[si][sj] = mat[ni][nj]+1
if si==I-1 and sj==J-1: return True
Q.append((si, sj))
return False
def check_main():
i, j, r = map(int, input().split())
if i+j <= r: return False
i, j = i-1, j-1
check_diamond(i, j, r)
return True
def check_diamond(ci, cj, cr):
std_step = ((0,-1),(-1,0),(0,1),(1,0))
std_didj = ((-1,1),(1,1),(1,-1),(-1,-1))
for idx in range(4):
k = 0
si, sj = std_step[idx]
i, j = ci+si*cr, cj+sj*cr
di, dj = std_didj[idx]
while k <= cr:
check_diamond_unit(i, j)
i, j, k = i+di, j+dj, k+1
def check_diamond_unit(i, j):
global mat, I, J
if not (0<=i<I and 0<=j<J): return
mat[i][j] = '*'
# ์
๋ ฅ
I, J = map(int, input().split())
N = int(input())
mat = [[0] * J for _ in range(I)]
ret = main()
print('YES' if ret else 'NO')
if ret: print(mat[I-1][J-1]-1)
BFS๋ฅผ ํ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์๋ค.
- ๊ฐ๋ก ์ธ๋ก ์
๋ ฅ์ ๋ฐ๊ณ , 2์ฐจ์ ๋ฐฐ์ด
mat
์ ๋ง๋ ๋ค. mat
์ ์ฐจ๊ฐ ๋งํ๋ ๋ฒ์๋ฅผ ํ์ํ๊ณ BFS๋ฅผ ๋๋ ค ์ฐ์ธก ํ๋จ์ ์ขํ์ ๋๋ฌํ ์ ์๋์ง ์ฒดํฌํ๋ค.- ํน์ ์ฐจ์ ๋ฒ์ ๋ด์ (0,0) ์ขํ๊ฐ ์๋ค๋ฉด ์ด๋์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์ด ๊ฒฝ์ฐ
NO
๋ฅผ ์ถ๋ ฅํ๋๋ก ๋ฒ์๋ฅผ ์ฒดํฌํ๋ค. - BFS์์๋ ๊ฐ์ฅ์๋ฆฌ์ ์ฐจ์ ๋ฒ์๋ฅผ ํ์ํ๊ฒ ๋๋ค. ๋ด๋ถ๋ 3๋ฒ์ ๊ณผ์ ์ ํตํด ํํฐ๋งํ ์ ์๋ค.
- ์ฐจ์ ์ค์ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฑฐ๋ฆฌ๋งํผ์ ๋ค์ด์๋ชฌ๋ ์์ญ์ ๋ชจ๋ ํ์ํ ์ ์๋ค๋ฉด (0,0) ์ขํ๋ถํฐ BFS๋ฅผ ์ค์ํ๋ค.
- ์ตํ๋จ์ ๋๋ฌํ๊ฑฐ๋, ๋ ์กฐํํ ์ขํ๊ฐ ์๋ค๋ฉด ์ข ๋ฃํ๋ค.
- ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ชฉ์ ์ขํ์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ