[BOJ][๐ก5][๋ฐฑ์ค#21772] ๊ฐํฌ์ ๊ณ ๊ตฌ๋ง ๋จน๋ฐฉ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๊ฐํฌ๋ ๊ณ ๊ตฌ๋ง๋ฅผ ์ ๋ง ์ข์ํฉ๋๋ค.
์ด๋ฒ์๋ ์ด๊น ์์ด ๊ณ ๊ตฌ๋ง ๋์๊ฐ ๋ฌ๋๋ฐ,ย ๊ณ ๊ตฌ๋ง๊ฐ ๋ณด์ด์ง ์์ต๋๋ค. ์ค๋น ๊ฐย ๋ฐฉย ์์ ๊ณ ๊ตฌ๋ง๋ฅผ ์จ๊ฒจ ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค๋น ๋ ๊ฐํฌ์๊ฒ ํ๋์ ๊ฒ์์ ์ ์ํ๊ณ , ๊ฒ์์ ๊ท์น์ ์ค๋ช ํด ์ฃผ์์ต๋๋ค. ๊ฒ์ ๊ท์น์ ์๋์ ๊ฐ์ต๋๋ค.
๊ฐํฌ๋ 1์ด๋ง๋ค ์ํ์ข์ฐ ๋ฐฉํฅ ์ค ํ ๋ฐฉํฅ์ผ๋ก 1๋ฒ ์ด๋ํ๊ฑฐ๋, ์ด๋ํ์ง ์๊ณ ๊ทธ ์๋ฆฌ์ ๋จธ๋ฌด๋ฅผ ์ ์์ต๋๋ค. ๊ฐํฌ๊ฐ ์ด๋ํ ์ง์ ์ ๊ณ ๊ตฌ๋ง๊ฐ ์๋ ๊ฒฝ์ฐ์๋, ๊ณ ๊ตฌ๋ง๋ฅผ ๋จน์ต๋๋ค. ๊ณ ๊ตฌ๋ง๋ฅผ ๋จน๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ฐํฌ๊ฐ ๊ณ ๊ตฌ๋ง๋ฅผ ๋จน์ผ๋ฉด, ๊ณ ๊ตฌ๋ง๊ฐ ๋ค์ ๊ทธ ์๋ฆฌ์ ์๊ธฐ์ง ์์ต๋๋ค.
๊ฐํฌ๋ ํ์ฌ ์์น์์ T์ด๋งํผ ์ด๋ํ์ ๋ ๊ณ ๊ตฌ๋ง๋ฅผ ์ต๋ํ ๋ง์ด ๋จน๊ณ ์ถ์ต๋๋ค. ๊ฐํฌ๊ฐ ์ต๋ ๋ช ๊ฐ์ ๊ณ ๊ตฌ๋ง๋ฅผ ๋จน์ ์ ์๋์ง ์๋ ค์ฃผ์ธ์.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋งต์ ์ธ๋กย ํฌ๊ธฐ R, ๊ฐ๋กย ํฌ๊ธฐ C, ๊ฐํฌ๊ฐ ์ด๋ํ๋ ์๊ฐ T๊ฐย ์ฃผ์ด์ง๋๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ R+1๋ฒ์งธ ์ค๊น์ง ๊ธธ์ด๊ฐ C์ธ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋๋ค. ์ฃผ์ด์ง๋ ๋ฌธ์์ด์ ์๋ ๋ฌธ์๋ย ๊ฐํฌ๋ฅผ ๋ํ๋ด๋ โGโ, ๊ณ ๊ตฌ๋ง๋ฅผ ๋ํ๋ด๋ โSโ, ๋น ์นธ์ ๋ํ๋ด๋ โ.โ, ์ฅ์ ๋ฌผ์ ๋ํ๋ด๋ โ#โย ์ค ํ๋ ์ ๋๋ค.
์ถ๋ ฅ
๋ฌธ์ ์ ๋ํ ๋ต์ ์ถ๋ ฅํฉ๋๋ค.
์ ํ
2 โค R โค 100 2 โค Cย โค 100 1 โค T โค 10 ๊ฐํฌ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ธ โGโ๋ ๋งต ์์ ํ๋๋ง ์์ต๋๋ค. โGโ๊ฐ ์๋ ์์น๋, ๊ฐํฌ์ ํ์ฌ ์์น์ ๋๋ค. โSโ๊ฐ ์๋ ์์น์ ๊ณ ๊ตฌ๋ง๋ 1๊ฐ ์์ต๋๋ค. ๊ณ ๊ตฌ๋ง์ย ์ฅ์ ๋ฌผ์ ์ต์ 1๊ฐ ์ด์ ์์ต๋๋ค. ๊ฐํฌ๋ ์ฅ์ ๋ฌผ์ ๋ฐ์ด ๋๊ฑฐ๋ ํต๊ณผํ ์ ์์ต๋๋ค. ๊ฐํฌ๋ ๋งต ๋ฐ์ผ๋ก ๋๊ฐ ์ ์์ต๋๋ค.
์์
์์ 1
์ ๋ ฅ
11 11 5
........G..
......S.#S.
........#.S
...........
...........
.##########
.##########
...........
...........
##########.
...........
์ถ๋ ฅ
2
์์ 2
์ ๋ ฅ
11 11 5
G....S.....
...........
...........
...........
...........
...........
.....#.....
...........
...........
...........
...........
์ถ๋ ฅ
1
My Sol
def main():
def find_G():
for i in range(I):
for j in range(J):
if mat[i][j] == 'G':
return i, j
def dfs(i, j, move, cnt, ate):
if move == T:
return cnt
cur_max = 0
for di, dj in ((-1, 0), (1, 0), (0, 1), (0, -1)):
si, sj = i + di, j + dj
if not (0 <= si < I and 0 <= sj < J): continue
if mat[si][sj] == '#': continue
new_ate = set([*ate])
new_cnt = cnt
if mat[si][sj] == 'S':
if not (si, sj) in ate:
new_ate.add((si, sj))
new_cnt += 1
dfs_max = dfs(si, sj, move + 1, new_cnt, new_ate)
else:
dfs_max = dfs(si, sj, move + 1, cnt, new_ate)
cur_max = max(cur_max, dfs_max)
return cur_max
I, J, T = map(int, input().split())
mat = [list(input()) for _ in range(I)]
gi, gj = find_G()
ret = dfs(gi, gj, 0, 0, set())
return ret
print(main())
dfs๋ฅผ ์ด์ฉํด์ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์๋ค. ๋จ์ํ bfs, dfs๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ์ด์ ์ ๊ณ ๊ตฌ๋ง๋ฅผ ์ง๋์ณค๋์ง ํ์ธํด์ผํ๋ฏ๋ก, ๋ชจ๋ ์์ง์ผ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๊ณ ๋ คํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ์ ๋ ฅ์ ๋ฐ๋๋ค.
- ๊ฐํฌ(G)์ ์์น๋ฅผ ํ์ธํด ์์ ์ขํ๋ฅผ ํ์ธํ๋ค. ๋๋ ์ด๋ฅผ
find_G
๋ผ๋ ํจ์๋ฅผ ์์ฑํด ์ฐพ์๋๋ค. dfs
๋ผ๋ ํจ์๋ก ๋ชจ๋ ์์ง์ ํ์ธํ๋๋ฐ, ์ด๋ ์ฌ๊ทํจ์๋กmove
๊ฐT
๊ฐ ๋๋ ์์ ์ด ์ข ๋ฃ ์กฐ๊ฑด์ด๋ค. ํด๋น ๊ฒฝ๋ก๊น์ง ์ ์ฅ๋ ๊ณ ๊ตฌ๋ง์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.dfs
ํจ์๋ ์ธ์๋ก ๋ค์ด์จ ์ขํ์ ์ํ์ข์ฐ๋ฅผ ์กฐํํ์ฌ ๋งต์ ๋ฒ์ด๋๊ฑฐ๋ ์ฅ์ ๋ฌผ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ์ด๋ํ๋ค.- ์ง๊ธ๊น์ง์ ๊ฒฝ๋ก์์ ๋จน์ ๊ณ ๊ตฌ๋ง์ ์ขํ๋ค์
ate
set์ผ๋ก ๋ฐ๋๋ฐ, ๊น์ ๋ณต์ฌ๋ฅผ ์ํด์ spread ํ ๋ค ๋ค์ set์ ๋ฃ์ด ์๋ก์ด set์ผ๋ก ๋ง๋ค์ด์ค๋ค. - ๋ง์ฝ ์ด๋ํ๋ ค๋ ์ขํ๊ฐ โSโ๊ฐ ์๋๋ผ๋ฉด ๊ทธ๋ฅ move๋ฅผ 1 ๋๋ฆฌ๋ ๋ฌด์๋ฏธํ ์ด๋์ด๋ฏ๋ก ์ธ์๋ฅผ ์กฐ์ ํด dfsํจ์๋ฅผ ์คํํ๋ฉด ๋๋ค.
- ๋ง์ฝ ์ด๋ํ๋ ค๋ ์ขํ๊ฐ โSโ๋ผ๋ฉด, ๊ณ ๊ตฌ๋ง๋ฅผ ๋ฐ๊ฒฌํ ์ํฉ์ธ๋ฐ, ์ด๋
ate
์ ๋ชฉํ ์ขํ๊ฐ ์๋ค๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ฒ์ด๋ฏ๋ก ๊ทธ๋ฅ ์ด๋ํ๋ค. ํ์ง๋ง ๋ง์ฝate
์ ์ด๋ ์ขํ๊ฐ ์๋ค๋ฉด ๊ณ ๊ตฌ๋ง๋ฅผ ์๋ก ํ๋ ๋จน์ ๊ฒ์ด๋ฏ๋กnew_cnt
๋ฅผ 1 ๋๋ฆฌ๊ณate
์ ์ด๋ ์ขํ๋ฅผ ๋ฃ์ด ์ธ์๋ก ์ ๋ฌํ๋ค. ์ดํ์ate
์ ํด๋น ์ขํ๊ฐ ์์ผ๋ฏ๋ก ์ค๋ณต ์นด์ดํธ ๋๋ ์ผ์ด ์์ ๊ฒ์ด๋ค. - ์ด๋ ๊ฒ ์ฌ๋ฐฉ์ผ๋ก ์ด๋ํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์
dfs
ํจ์ ๋ฐํ๊ฐ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฐ์ ธ ๋ฐํํ๋ฉด,main
ํจ์์์ ์ต์ด๋ก ํธ์ถํdfs
์ ๋ฐํ๊ฐ์ T๋ฒ ์ด๋ํ ๊ฒฝ์ฐ ์ป์ ์ ์๋ ๊ณ ๊ตฌ๋ง์ ์ต๋๊ฐ์๊ฐ ๋๋ค. - ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
def recur(r, c, t, eat):
global ans
if eat + t <= ans:
return
if t == 0:
if eat > ans:
ans = eat
return
for d in range(4):
nr, nc = r + dr[d], c + dc[d]
if 0 <= nr < R and 0 <= nc < C and arr[nr][nc] != '#':
if arr[nr][nc] == 'S':
arr[nr][nc] = '.'
recur(nr, nc, t-1, eat+1)
arr[nr][nc] = 'S'
else:
recur(nr, nc, t-1, eat)
R, C, T = map(int, input().split())
arr = []
TF = False
for i in range(R):
arr.append(list(input()))
if not TF and 'G' in arr[i]:
TF = True
sr, sc = i, arr[i].index('G')
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
ans = 0
recur(sr, sc, T, 0)
print(ans)
๊ฐ์ฅ ์ฐ์ฐ์๊ฐ์ด ์งง์ ์ฝ๋๋ฅผ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ์ด ๊ฒฝ์ฐ ๋๊ฐ์ด DFS๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง, ๋จ์ ์์ง์์ ๊ธฐํ์ ํ์ฌ ๋จน์ ๊ณ ๊ตฌ๋ง์ ๊ฐ์์ ํฉ์ด ํ์ฌ๊น์ง์ ์ต๋ ๊ณ ๊ตฌ๋ง์ ๋ณด๋ค ์ ๊ฑฐ๋ ๊ฐ๋ค๋ฉด ๋ ์งํํ๋ ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์ค๋จํ๋ ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ์๋ค.
๋ฌด์๋ณด๋ค ๋๋ณด์ด๋ ๊ฒ์ ๊ณ ๊ตฌ๋ง์ ์ค๋ณต ์ฒดํฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ณ ๊ตฌ๋ง์ ์ขํ๋ฅผ ๋ฐ์ผ๋ฉด โSโ๋ฅผ โ.โ๋ก ๋ณ๊ฒฝํ๊ณ ํด๋น dfs๋ฅผ ๋ชจ๋ ์งํํ์ฌ ๊ณ ๊ตฌ๋ง์ ์ต๋๊ฐ์ ๋ํ ๊ณ์ฐ์ ๋ง์น๊ณ ๋์์ค๋ฉด โ.โ๋ฅผ ๋ค์ โSโ๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ ํ์ฉํ ๊ฒ์ด๋ค. ๋ด๊ฐ ๋ณ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๋ set์ ์์์ด ๋ง๋ค์ด ์ธ์๋ก ๋๊ธด ๋ฐฉ์๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ธ ๋ฐฉ์์ด์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ