[BOJ] 4179. ๋ถˆ! (๐Ÿฅ‡, BFS/DFS)

lemythe423ยท2023๋…„ 6์›” 11์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
16/133
post-thumbnail

๋ฌธ์ œ

ํ’€์ด

์˜ค๋žœ๋งŒ์— ํ’€์–ด๋ณธ BFS ๋ฌธ์ œ์˜€๋Š”๋ฐ ์ด ๋ฌธ์ œ๋Š” ์ง„์งœ ์‹ค์ˆ˜๋ฅผ ๊ฒ๋‚˜ ๋งŽ์ด ํ–ˆ๋‹ค...

์šฐ์„  ๋กœ์ง ์ž์ฒด๋Š”,

  1. ๋ถˆ์ด ๋จผ์ € ํ™•์‚ฐํ•œ๋‹ค
  2. ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•œ๋‹ค
  3. ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์— ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์นธ์ด ์žˆ๋‹ค๋ฉด ์‹œ๊ฐ„ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
  4. ์ง€ํ›ˆ์ด๊ฐ€ ๋” ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์ด ์—†๋‹ค๋ฉด ํƒˆ์ถœ ๋ถˆ๊ฐ€ IMPOSSIBLE ์ถœ๋ ฅ

๋ถˆ์€ #์ด ์•„๋‹Œ ๋ชจ๋“  ๊ณณ์„ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•˜๊ณ , ๋ถˆ์ด ์ง€๋‚˜๊ฐ„ ๊ณณ์€ # ์ฒ˜๋ฆฌ
์ง€ํ›ˆ์ด๋Š” .์ธ ๊ณณ๋งŒ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•˜๊ณ , ์ง€ํ›ˆ์ด๊ฐ€ ์ง€๋‚˜๊ฐ„ ๊ณณ์€ J

  1. ์ง€ํ›ˆ์ด์™€ ๋ถˆ์€ ๋™์‹œ์— ํ™•์‚ฐ๋˜์ง€๋งŒ ๋ถˆ์€ ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•œ ๊ณณ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์–ด๋„ ์ง€ํ›ˆ์ด๋Š” ๋ถˆ์ด ์žˆ๋Š” ๊ณณ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์ด ๋จผ์ € ์ด๋™
  2. ์ง€ํ›ˆ์ด๊ฐ€ ์ดํ›„์— ๋ถˆ์ด ์—†๋Š” ์นธ๋งŒ ์ด๋™
  3. ํƒˆ์ถœ๊ตฌ๋Š” ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ์ž๋ฆฌ์— ๋‹ฟ๋Š”๋‹ค๋ฉด ๊ทธ๋•Œ ์‹œ๊ฐ„์ด ํƒˆ์ถœ ์‹œ๊ฐ„
  4. ๋ถˆ์ด ์ด๋™ํ•œ ํ›„์— ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ–ˆ๋Š”๋ฐ ๋” ์ด์ƒ ์ด๋™ํ•  ์นธ์ด ์—†๋‹ค๋ฉด ํƒˆ์ถœ์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ IMPOSSIBLE.

์‹ค์ˆ˜1

์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์ด ์—ฌ๋Ÿฌ ์นธ์ผ ๋•Œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ

1์ดˆ ๊ทธ๋ž˜ํ”„
F F . . F F F
F # # . # # .
. # # J # # .
. . J J J . .
. # # J # # .
F # # . # # .
F F . . F F F
2์ดˆ ๊ทธ๋ž˜ํ”„
F F F F F F F
F # # . # # F
F # # J # # .
. . J J J . .
F # # J # # .
F # # J # # F
F F F F F F F
3์ดˆ ๊ทธ๋ž˜ํ”„
F F F F F F F
F # # F # # F
F # # J # # F
F . J J J . .
F # # J # # F
F # # F # # F
F F F F F F F
4์ดˆ ๊ทธ๋ž˜ํ”„
F F F F F F F
F # # F # # F
F # # F # # F
F F J J J J F
F # # F # # F
F # # F # # F
F F F F F F F

์ •๊ฐ€์šด๋ฐ J๊ฐ€ ์‹ค์ œ ์ง€ํ›ˆ์ด์˜ ์ถœ๋ฐœ์ 
๊ฑฐ๊ธฐ์„œ 4๋ฐฉํ–ฅ์œผ๋กœ ๋ป—์–ด๋‚˜๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ 4๋ฐฉํ–ฅ ๋ชจ๋‘๊ฐ€ ํ™•์‚ฐ -> ๋ถˆ์ด ํ™•์‚ฐ -> 4๋ฐฉํ–ฅ์—์„œ ํ™•์‚ฐ๋œ ์นธ๋“ค์—์„œ ๋˜ ํ™•์‚ฐ ->... ์ด๋ ‡๊ฒŒ ์ง„ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ง€๊ธˆ์€ 4๋ฐฉํ–ฅ ์ค‘ 1๋ฐฉํ–ฅ๋งŒ ํ™•์‚ฐ -> ๋ถˆ ํ™•์‚ฐ -> ๋‚˜๋จธ์ง€ ์ค‘ ๋˜ 1๋ฐฉํ–ฅ ํ™•์‚ฐ -> ๋ถˆ ํ™•์‚ฐ.. ์ด๋Ÿฐ ์‹์ด๋ผ์„œ ๋ถˆ์˜ ๋ฒˆ์ง์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ ๋ฌด์กฐ๊ฑด ํƒˆ์ถœ์ด ๋ถˆ๊ฐ€ํ•œ ์ƒํƒœ๊ฐ€ ๋จ

def exodus(J, fq):
    jr, jc = J
    MAZE[jr][jc] == 'J' # ์ง€ํ›ˆ์ด๊ฐ€ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์„ ๋˜ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ
    jq = [(jr, jc)]
    time = 1
    # ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์—ญ์ด ์žˆ๋‚˜?
    while jq:

        # ๋ถˆ์ด ๋จผ์ € ํ™•์‚ฐ๋˜๊ณ 
        new_fq = []
        for fr, fc in fq:
            for nr, nc in (fr-1, fc), (fr+1, fc), (fr, fc-1), (fr, fc+1):
                if nr<0 or nc<0 or nr>=R or nc>=C or MAZE[nr][nc] == '#':
                    continue
                new_fq.append((nr, nc))
                MAZE[nr][nc] = '#'

        fq = new_fq[:]

        # ๋ถˆ๊ณผ ๋ฒฝ, ์ด๋ฏธ ์ง€ํ›ˆ์ด๊ฐ€ ๋ฐฉ๋ฌธํ•œ ๊ณต๊ฐ„์„ ์ œ์™ธํ•˜๊ณ  ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ
        # ๋” ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๋‹ค๋ฉด ....
        jr, jc = jq.pop(0)
        for _nr, _nc in (jr+1, jc), (jr-1, jc), (jr, jc+1), (jr, jc-1):
            if _nr<0 or _nc<0 or _nr>=R or _nc>=C:
                return time
            
            if MAZE[_nr][_nc] != '.':
                continue
            
            MAZE[_nr][_nc] = 'J'
            jq.append((_nr, _nc))

        time += 1

    return 'IMPOSSIBLE'

๋ถˆ์˜ ๊ฒฝ์šฐ for๋ฌธ์œผ๋กœ ๋ชจ๋“  ๋ถˆ์ด ํ™•์‚ฐํ•˜๋Š”๋ฐ ์ง€ํ›ˆ์ด๋Š” jr, jc ๋”ฑ ํ•˜๋‚˜์˜ ์นธ๋งŒ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค... ์ง€ํ›ˆ์ด์˜ ์ด๋™ ๋ฐฉ์‹๋„ pop์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ for๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค

new_jq = []
for jr, jc in jq:
    for _nr, _nc in (jr+1, jc), (jr-1, jc), (jr, jc+1), (jr, jc-1):
        if _nr<0 or _nc<0 or _nr>=R or _nc>=C:
            return time
        
        if MAZE[_nr][_nc] != '.':
            continue
        
        MAZE[_nr][_nc] = 'J'
        new_jq.append((_nr, _nc))

jq = new_jq[:]

์‹ค์ˆ˜2 (๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ)

์ด ์‹ค์ˆ˜๋Š” ์ง„์งœ ๋ฉ์ฒญํ–ˆ๋‹ค... ์œ„์˜ ์‹ค์ˆ˜1์„ ๊ณ ์น˜๋ ค๊ณ  ๋””๋ฒ„๊น…ํ•˜๋ ค๋‹ค๊ฐ€ ํ„ฐ์ง„ ์—๋Ÿฌ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ผ๋‹จ ๋ถˆ์ด ๋ฐฉ๋ฌธํ•œ ๊ณณ์€ # ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์„œ ์žฌ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๋””๋ฒ„๊น…ํ•œ๋‹ต์‹œ๊ณ  ์ด๊ฑธ F๋กœ ๋ฐ”๊ฟ”๋’€๋˜ ๊ฑธ ๊ณ ์น˜์ง€ ์•Š์•„์„œ ํ„ฐ์ง„ ์—๋Ÿฌ์˜€๋‹ค...

  • F๋กœ ํ–ˆ์„ ๋•Œ

  • #๋กœ ํ–ˆ์„ ๋•Œ

ํ•œ ๋งˆ๋””๋กœ ๊ฑ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ์•ˆ ํ•ด์ค˜์„œ ํ„ฐ์ง„ ๋ฌธ์ œ ใ…Žใ…Ž

๊ทธ์™ธ ์‹ค์ˆ˜...

๊ทธ ์™ธ์—๋„ jq ๋ฆฌ์ŠคํŠธ new_jq๋กœ ์•ˆ ๋ฐ”๊ฟ”์„œ ํ„ฐ์ง„ ๋ฌธ์ œ
new_jq๋ž‘ new_fq ์“ด ๊ฒƒ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ํ„ฐ์ง„ ์ค„ ์•Œ๊ณ  ์ฝ”๋“œ ์ˆ˜์ •ํ•œ ๋ฉ์ฒญ์ด ๊ฐ™์€ ๋ฌธ์ œใ…œ
l์ด๋ž‘ _l ํ—ท๊ฐˆ๋ฆฐ ๋ฌธ์ œ ๋“ฑ ์„ฑ๊ฒฉ ๊ธ‰ํ•ด์„œ ๊ทธ๋ƒฅ ์ œ์ถœํ–ˆ๋‹ค๊ฐ€ ์‚ฌ์†Œํ•œ๋ฐ์„œ ์˜คํƒ€๋‚œ ์ž์ž˜ํ•œ ์‹ค์ˆ˜๋“ค์ด ์žˆ์—ˆ๋‹ค..

์ตœ์ข…์ฝ”๋“œ

# 908ms

def find_JF():
    global J, F
    for i in range(R):
        for j in range(C):
            if MAZE[i][j] == 'F':
                F.append((i, j))
            elif MAZE[i][j] == 'J':
                J = [i, j]

def exodus(J, fq):
    jr, jc = J
    MAZE[jr][jc] == 'J' # ์ง€ํ›ˆ์ด๊ฐ€ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์„ ๋˜ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ
    jq = [(jr, jc)]
    time = 1
    # ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์—ญ์ด ์žˆ๋‚˜?
    while jq:

        # ๋ถˆ์ด ๋จผ์ € ํ™•์‚ฐ๋˜๊ณ 
        new_fq = []
        for fr, fc in fq:
            for nr, nc in (fr-1, fc), (fr+1, fc), (fr, fc-1), (fr, fc+1):
                if nr<0 or nc<0 or nr>=R or nc>=C or MAZE[nr][nc] == '#':
                    continue
                new_fq.append((nr, nc))
                MAZE[nr][nc] = '#'

        fq = new_fq[:]

        # ๋ถˆ๊ณผ ๋ฒฝ, ์ด๋ฏธ ์ง€ํ›ˆ์ด๊ฐ€ ๋ฐฉ๋ฌธํ•œ ๊ณต๊ฐ„์„ ์ œ์™ธํ•˜๊ณ  ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ
        # ๋” ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๋‹ค๋ฉด ....
        new_jq = []
        for jr, jc in jq:
            for _nr, _nc in (jr+1, jc), (jr-1, jc), (jr, jc+1), (jr, jc-1):
                if _nr<0 or _nc<0 or _nr>=R or _nc>=C:
                    return time
            
                if MAZE[_nr][_nc] != '.':
                    continue
            
                MAZE[_nr][_nc] = 'J'
                new_jq.append((_nr, _nc))
                
        jq = new_jq[:]
        time += 1

    return 'IMPOSSIBLE'

R, C = map(int, input().split())
MAZE = [list(input()) for _ in range(R)]
J, F = [], []

find_JF()
print(exodus(J, F))

ํ›„๊ธฐ

ํ•ญ์ƒ BFS ๋งŒ๋งŒํ•˜๊ฒŒ ๋ณด๊ณ  ํ‘ธ๋Š”๋ฐ ๊ทธ๋ž˜์„œ์ธ์ง€ ์ž์ž˜ํ•œ ์‹ค์ˆ˜๋ฅผ ๊ฒ๋‚˜ ๋งŽ์ด ํ•œ๋‹ค^^
๊ทผ๋ฐ ์ง€๋‚œ ์ƒ๋ฐ˜๊ธฐ์— ๋ณธ ํ•œ 4๋ฒˆ์˜ ์ฝ”ํ…Œ์—์„œ bfs ๋ฌธ์ œ ํ•œ ๋ฒˆ๋„ ์•ˆ ๋‚˜์™”๋‹ค ใ…Žใ…Ž ๋‹ค๋“ค ์‹ค๋ ฅ์ด ํ–ฅ์ƒ๋˜๊ธด ํ–ˆ๋Š”๊ฐ€๋ณด๋‹คใ…

profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€