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

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

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

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

๋ฌธ์ œ

ํ’€์ด

์ง„์งœ ์ด ๋ฌธ์ œ ๋ญ˜๊นŒ
์–ด์ œ๋ถ€ํ„ฐ ๋‚  ๊ณ ์ƒ์‹œํ‚ค๋Š” ๋ถˆ...์ด์•ผ...

์†”์งํžˆ ๋ฌธ์ œ ์ž์ฒด๋Š” ๋ณ„๋กœ ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค
๋ถˆ! ์ด๋ž‘ ๋˜‘๊ฐ™๋‹ค
๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋ฅผ ๋˜‘๊ฐ™์ด ๋ƒ‡๋‹ค

๋”ฐ๋ž€!

๋ถˆ!์ด๋ž‘ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒŒ ์—†๋Š”๋ฐ ์ž๊พธ 12%์—์„œ ํ„ฐ์กŒ๋‹ค
์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์„ ๋‹ค ๋’ค์ ธ๋ด๋„ ๋‚ด๊ฐ€ ๋†“์นœ ์กฐ๊ฑด์ด๋‚˜ ๊ณ ๋ ค์‚ฌํ•ญ์ด ์ „ํ˜€ ์—†๋Š”๋ฐ๋‹ค๊ฐ€ ์‹ฌ์ง€์–ด ํ…Œ์ผ€๋ž‘ ๋ฐ˜๋ก€๊นŒ์ง€ ๋‹ค ๋„ฃ์–ด๋„ ํ‹€๋ฆฐ ๊ฑธ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๋‹ต๋‹ตํ•ด ๋ฏธ์น  ์ง€๊ฒฝ์ด์—‡๋Š”๋ฐ


์ž ํ‹€๋ฆฐ ๊ทธ๋ฆผ ์ฐพ๊ธฐ ์‹œ์ž‘~!

์€ ๊ฐœ๋ฟ” ๊ทธ๋ƒฅ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์—์„œ time += 1 ๋ถ€๋ถ„์ด ์ง€์›Œ์ ธ๋ฒ„๋ ค์„œ ์ œ๋Œ€๋กœ ๋œ time์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š์•„ ๋‚˜๋Š” ์—๋Ÿฌ์˜€๋‹ค

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

# 1792ms

def find_JF():
    global J, F
    for i in range(h):
        for j in range(w):
            if MAZE[i][j] == '*':
                F.append((i, j))
            elif MAZE[i][j] == '@':
                J = [i, j]

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

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

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

        jq = jq[_l:]
        time += 1

    return 'IMPOSSIBLE'

for _ in range(int(input())):
    w, h = map(int, input().split())
    MAZE = [list(input()) for _ in range(h)]
    J, F = [], []

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

ํ›„๊ธฐ

์ €๊ฑฐ ์ฐพ์œผ๋ ค๊ณ  ์ด ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋œ ๋Œ€ํšŒ ์‚ฌ์ดํŠธ๊นŒ์ง€ ๋“ค์–ด๊ฐ€์„œ ์ˆ˜๋ฐฑ์ค„์˜ ๋ฐ˜๋ก€๊นŒ์ง€ ๋‹ค์šด๋ฐ›์•„์„œ ์ž…๋ ฅํ•ด๋ดค๋‹ค
์ด๊ฑฐ ๋•Œ๋งค 30๋ถ„ ๋‚ ๋ฆผ ^^

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

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