๋ฐฑ์ค€#2638 Gold4 ์น˜์ฆˆ(2)๐Ÿง€ (Python, ํŒŒ์ด์ฌ)

์ž„์ค€์„ฑยท2022๋…„ 5์›” 4์ผ
0

๋ฐฑ์ค€ Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
4/59
post-thumbnail

๋ฐฑ์ค€ 2638๋ฒˆ
https://www.acmicpc.net/problem/2638


๋ฌธ์ œ



ํ›„๊ธฐ

โฐ ํ’€์ด์‹œ๊ฐ„ 1์‹œ๊ฐ„ ++โฐ

์–ผ๋งˆ์ „์— ์ž‘์„ฑ ํ•˜์˜€๋˜ #2636 ์น˜์ฆˆ์™€ ๊ฑฐ์˜ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๋‹ค.

๋‹จ์ง€ ์ฐจ์ด์ ์€, ์น˜์ฆˆ๊ฐ€ ํ•œ ๋ฉด์˜ ๋ฐ”๊นฅ ๊ณต๊ธฐ์—๋งŒ ๋‹ฟ์•„๋„ ๋…น๋Š๋ƒ, ๋ฐ”๊นฅ ๊ณต๊ธฐ์— ๋‘ ๋ฉด ์ด์ƒ ๋‹ฟ์•„์•ผ

๋…น๋Š๋ƒ์˜ ๋ฌธ์ œ์ด๋‹ค.

remove_cheese์—์„œ ์น˜์ฆˆ๊ฐ€

(์œ„์˜ค๋ฅธ์ชฝ), (์œ„์•„๋ž˜), (์œ„์™ผ์ชฝ), (์˜ค๋ฅธ์ชฝ์•„๋ž˜), (์˜ค๋ฅธ์ชฝ์™ผ์ชฝ), (์•„๋ž˜์™ผ์ชฝ)

์ด 6๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•˜์—ฌ ๋…น์„ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์ด ์™ธ์—๋Š” 2636 ์น˜์ฆˆ์™€ ๊ฐ™์€ ๋ฌธ์ œ์ด๋ฏ€๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋‚˜์˜ ํ’€์ด

import sys

input = sys.stdin.readline

sys.setrecursionlimit(10**7)

n, m = map(int,input().split())

graph= [] 

for i in range(n):

    graph.append(list(map(int,input().split())))

visited= [ [False] * m for _ in range(n)]

# ํ’€์ด์ˆœ์„œ cheese์˜ ์–‘์„ ์ฒดํฌํ•ด์„œ 0์ด ์•„๋‹ˆ๋ฉด ๋ฐ˜๋ณต์‹คํ–‰  

# ๋ฐ”๊นฅ์— ์žˆ๋Š” ๊ณต๊ธฐ๋“ค์„ ์šฐ์„  9๋กœ ์ „๋ถ€ ๋ฐ”๊พธ๊ณ  ( ๋ฐ”๊นฅ๊ณต๊ธฐ ์•ˆ์ชฝ๊ณต๊ธฐ ํŒ๋ณ„ )

# 9์— ์ ‘ํ•ด์žˆ๋Š” ์น˜์ฆˆ๋“ค์€ ๋ชจ๋‘ ๋…น์ธ๋‹ค.

# ํ•œ๋ฒˆ์— ๋ชจ๋‘ ์ œ๊ฑฐํ•œ๋‹ค. time์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ํ˜„์žฌ ๋‚จ์€ ์น˜์ฆˆ์˜ ์–‘์„ ์ €์žฅํ•œ๋‹ค. 

# visited๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋ฐ˜๋ณตํ•œ๋‹ค. 


def check_cheese(x,y):  # ๊ณต๊ธฐ๊ฐ€ ๋ฐ”๊นฅ๊ณต๊ธฐ ์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜

    if x<=-1 or x>=n or y<=-1 or y>=m :

        return False
    
    if not visited[x][y] and (graph[x][y] ==0 or graph[x][y]==9):

        graph[x][y] = 10   #๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ์ง€์•Š๊ธฐ ์œ„ํ•ด ์ผ๋‹จ 10์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“๊ณ 

        check_cheese(x,y-1)
        check_cheese(x,y+1)
        check_cheese(x+1,y)
        check_cheese(x-1,y)

        return True

    return False



def remove_cheese(x,y):  #์น˜์ฆˆ๊ฐ€ ๋ฐ”๊นฅ ๊ณต๊ธฐ์— ๋‹ฟ์•„์žˆ๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜
    global cncnt
    global cnt

    if x<=-1 or x>=n or y<=-1 or y>=m:

        return False
    

    if not visited[x][y] and graph[x][y] == 1 and ( ( graph[x][y+1] ==9 and graph[x+1][y] == 9 ) or ( graph[x][y+1] ==9 and graph[x][y-1] == 9 ) or 
    ( graph[x][y+1] ==9 and graph[x-1][y] == 9 ) or ( graph[x+1][y] ==9 and graph[x][y-1] == 9 ) or ( graph[x+1][y] ==9 and graph[x-1][y] == 9 ) or ( graph[x][y-1] ==9 and graph[x-1][y] == 9 )):

        graph[x][y] = -3

        cnt +=1  #๋…น์„ ์น˜์ฆˆ์˜ ์–‘์ด๋‹ค.

        return True
    
    return False



cheese = 0  #์ „์ฒด์น˜์ฆˆ์˜์–‘
now_cheese = [] #ํ˜„์žฌ ์น˜์ฆˆ์˜ ์–‘์„ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ
time = 0  #์น˜์ฆˆ๋ฅผ ๋…น์ด๋Š”๋ฐ ๊ฑธ๋ฆด์‹œ๊ฐ„



#์น˜์ฆˆ์˜ ์–‘์„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋Œ๋ฉฐ ๊ตฌํ•œ๋‹ค. ์ „์ฒด ์น˜์ฆˆ์˜ ์–‘์„ ๊ตฌํ•ด์•ผ ์น˜์ฆˆ๊ฐ€ 0์ด ๋์„ ๋•Œ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
for i in range(n):

    for j in range(m):

        if graph[i][j] == 1:

            cheese+=1



while True:  #์น˜์ฆˆ๊ฐ€ 0์ด ๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ณ„์† ๋Œ์˜ˆ์ •

        
    if cheese ==0: 
        print(time)
        exit()


    check_cheese(0,0)

    #graph๋ฅผ ๋Œ๋ฉด์„œ 10์œผ๋กœ ๋งŒ๋“ค์–ด ๋‘์—ˆ๋˜ ๊ณต๊ธฐ๋“ค์„ ๋ฐ”๊นฅ ๊ณต๊ธฐ์ธ 9๋กœ ๋งŒ๋“ ๋‹ค. ๋ฌดํ•œloop๋ฅผ ๋Œ์ง€์•Š๊ธฐ์œ„ํ•œ ์ž‘์—…

    for i in range(n):

        for j in range(m):

            if graph[i][j]==10:

                graph[i][j] = 9  
    
    
    visited= [ [False] * m for _ in range(n)]  #๋ฐ”๊นฅ ๊ณต๊ธฐ๋ฅผ ๋Œ๋ฉฐ visited๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค€๋‹ค.

    cnt = 0 #์น˜์ฆˆ๊ฐ€ ๋ช‡๊ฐœ ๋…น์„ ์˜ˆ์ •์ธ์ง€๋„ ์ดˆ๊ธฐํ™”


    for i in range(n):

        for j in range(m):

            if not visited[i][j]:

                remove_cheese(i,j)  #์น˜์ฆˆ๋ฅผ ์ œ๊ฑฐํ•  ์ค€๋น„

    cheese -= cnt


    for i in range(n):

        for j in range(m):

            if graph[i][j]==-3:

                graph[i][j] = 9  #์น˜์ฆˆ๊ฐ€ ๋…น์•˜๋‹ค



    time +=1 # ๋ชจ๋“  ์ž‘์—…์ด ๋๋‚ฌ์œผ๋‹ˆ 1์‹œ๊ฐ„ ๊ฒฝ๊ณผํ•œ๋‹ค.





profile
์•„๋ฌด๋ตํฌ ์žˆ์ด

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