[BOJ][๐ŸŸก5][๋ฐฑ์ค€#21772] ๊ฐ€ํฌ์˜ ๊ณ ๊ตฌ๋งˆ ๋จน๋ฐฉ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #21772


๋ฌธ์ œ

๊ฐ€ํฌ๋Š” ๊ณ ๊ตฌ๋งˆ๋ฅผ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋„ ์–ด๊น€ ์—†์ด ๊ณ ๊ตฌ๋งˆ ๋ƒ„์ƒˆ๊ฐ€ ๋‚ฌ๋Š”๋ฐ,ย ๊ณ ๊ตฌ๋งˆ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋น ๊ฐ€ย ๋ฐฉย ์•ˆ์— ๊ณ ๊ตฌ๋งˆ๋ฅผ ์ˆจ๊ฒจ ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ค๋น ๋Š” ๊ฐ€ํฌ์—๊ฒŒ ํ•˜๋‚˜์˜ ๊ฒŒ์ž„์„ ์ œ์•ˆํ•˜๊ณ , ๊ฒŒ์ž„์˜ ๊ทœ์น™์„ ์„ค๋ช…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๊ทœ์น™์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ€ํฌ๋Š” 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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด์ „์— ๊ณ ๊ตฌ๋งˆ๋ฅผ ์ง€๋‚˜์ณค๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•˜๋ฏ€๋กœ, ๋ชจ๋“  ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

  1. ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.
  2. ๊ฐ€ํฌ(G)์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•ด ์‹œ์ž‘ ์ขŒํ‘œ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋‚˜๋Š” ์ด๋ฅผ find_G ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด ์ฐพ์•„๋ƒˆ๋‹ค.
  3. dfs๋ผ๋Š” ํ•จ์ˆ˜๋กœ ๋ชจ๋“  ์›€์ง์„ ํ™•์ธํ•˜๋Š”๋ฐ, ์ด๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋กœ move๊ฐ€ T๊ฐ€ ๋˜๋Š” ์‹œ์ ์ด ์ข…๋ฃŒ ์กฐ๊ฑด์ด๋‹ค. ํ•ด๋‹น ๊ฒฝ๋กœ๊นŒ์ง€ ์ €์žฅ๋œ ๊ณ ๊ตฌ๋งˆ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. dfs ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ๋“ค์–ด์˜จ ์ขŒํ‘œ์˜ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋งต์„ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์žฅ์• ๋ฌผ์ธ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด๋™ํ•œ๋‹ค.
  5. ์ง€๊ธˆ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์—์„œ ๋จน์€ ๊ณ ๊ตฌ๋งˆ์˜ ์ขŒํ‘œ๋“ค์„ ate set์œผ๋กœ ๋ฐ›๋Š”๋ฐ, ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์œ„ํ•ด์„œ spread ํ•œ ๋’ค ๋‹ค์‹œ set์— ๋„ฃ์–ด ์ƒˆ๋กœ์šด set์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  6. ๋งŒ์•ฝ ์ด๋™ํ•˜๋ ค๋Š” ์ขŒํ‘œ๊ฐ€ โ€˜Sโ€™๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๋ƒฅ move๋ฅผ 1 ๋Š˜๋ฆฌ๋Š” ๋ฌด์˜๋ฏธํ•œ ์ด๋™์ด๋ฏ€๋กœ ์ธ์ž๋ฅผ ์กฐ์ •ํ•ด dfsํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
  7. ๋งŒ์•ฝ ์ด๋™ํ•˜๋ ค๋Š” ์ขŒํ‘œ๊ฐ€ โ€˜Sโ€™๋ผ๋ฉด, ๊ณ ๊ตฌ๋งˆ๋ฅผ ๋ฐœ๊ฒฌํ•œ ์ƒํ™ฉ์ธ๋ฐ, ์ด๋•Œ ate ์— ๋ชฉํ‘œ ์ขŒํ‘œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ์ด๋™ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ate์— ์ด๋™ ์ขŒํ‘œ๊ฐ€ ์—†๋‹ค๋ฉด ๊ณ ๊ตฌ๋งˆ๋ฅผ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋จน์€ ๊ฒƒ์ด๋ฏ€๋กœ new_cnt๋ฅผ 1 ๋Š˜๋ฆฌ๊ณ  ate์— ์ด๋™ ์ขŒํ‘œ๋ฅผ ๋„ฃ์–ด ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ดํ›„์—” ate์— ํ•ด๋‹น ์ขŒํ‘œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋ณต ์นด์šดํŠธ ๋˜๋Š” ์ผ์ด ์—†์„ ๊ฒƒ์ด๋‹ค.
  8. ์ด๋ ‡๊ฒŒ ์‚ฌ๋ฐฉ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ dfs ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋”ฐ์ ธ ๋ฐ˜ํ™˜ํ•˜๋ฉด, main ํ•จ์ˆ˜์—์„œ ์ตœ์ดˆ๋กœ ํ˜ธ์ถœํ•œ dfs์˜ ๋ฐ˜ํ™˜๊ฐ’์€ T๋ฒˆ ์ด๋™ํ•œ ๊ฒฝ์šฐ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ณ ๊ตฌ๋งˆ์˜ ์ตœ๋Œ€๊ฐœ์ˆ˜๊ฐ€ ๋œ๋‹ค.
  9. ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

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์„ ์ˆ˜์—†์ด ๋งŒ๋“ค์–ด ์ธ์ž๋กœ ๋„˜๊ธด ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ธ ๋ฐฉ์‹์ด์—ˆ๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ