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

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

๋ฐฑ์ค€ Algorithm

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

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


๋ฌธ์ œ




ํ›„๊ธฐ

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

์ƒ๋‹นํžˆ ํž˜๋“ค์—ˆ๋‹ค. ์šฐ์„  ๋ฐ”๊นฅ ๊ณต๊ธฐ์™€ ์น˜์ฆˆ ์•ˆ์ชฝ ๊ณต๊ธฐํŒ๋ณ„์„ ์œ„ํ•œ ์ƒ๊ฐ์„ ๋– ์˜ฌ๋ฆฌ๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ•œ์ฐธ ์†Œ๋ชจํ–ˆ๋‹ค.

๋‚ด๋ฆฐ ๊ฒฐ๋ก ์€ ๊ทธ๋ž˜ํ”„์˜ (0,0) ์ง€์ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋‹ฟ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์€ ๋ฐ”๊นฅ ๊ณต๊ธฐ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.


๋‹ค์Œ ํ•ด๊ฒฐ์ฑ…์€ ๋…น์ผ ์น˜์ฆˆ๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Š” DFS๋ฅผ ๋Œ๋ฉฐ ์น˜์ฆˆ์˜ ์ƒํ•˜์ขŒ์šฐ์— ๋ฐ”๊นฅ ๊ณต๊ธฐ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋‹ฟ์•„ ์žˆ์œผ๋ฉด 1์‹œ๊ฐ„ ๋’ค์— ๋…น๋Š”๋‹ค๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ DFS ์•ˆ์—์„œ ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ์ผ์–ด๋‚˜, ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ƒ๊ฐ์„ ํ•œ์ฐธ ํ–ˆ๋Š”๋ฐ, ๊ฒฐ๋ก ์€ While ์•ˆ์—์„œ ํ•œ ๋ฒˆ ๋” ๊ทธ๋ž˜ํ”„ ์ „์ฒด๋ฅผ ๋Œ๋ฉฐ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ, ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์ง€๋งŒ, ์•„์ง์€ ๋‚˜์˜ ์‹ค๋ ฅ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์—” ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

์ฒ˜์Œ์—” ์ฝ”๋“œ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์•„ ๋ฌด์—‡์ด ๊ณ„์† ๋ฌธ์ œ์ผ๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์„ ์ •๋ง ๋งŽ์ด ํ–ˆ๋‹ค.

๋ฌธ์ œ์ ์€ check_cheese์™€ remove_cheese์—์„œ ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

๊ทธ๋ž˜ํ”„์™€ DFS , BFS์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค๋ฉด, ํ•จ์ˆ˜ ์ค‘๊ฐ„์— print(graph) ๋“ฑ์„ ์ž…๋ ฅํ•˜์—ฌ ์–ด๋Š ๋ถ€๋ถ„์—์„œ
์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ณด๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ๊ฐ„ ๋•๋ถ„์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ถ”ํ›„ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด๋ณผ ์˜ˆ์ •

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

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 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 or graph[x][y+1] ==9 or graph[x-1][y] == 9 or 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)
        print(now_cheese[-1])
        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 #์น˜์ฆˆ๊ฐ€ ๋ช‡๊ฐœ ๋…น์„ ์˜ˆ์ •์ธ์ง€๋„ ์ดˆ๊ธฐํ™”
    
    now_cheese.append(cheese) #ํ˜„์žฌ ์น˜์ฆˆ์˜ ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ด ๋‘์–ด์•ผ ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•œ "ํ•œ ์‹œ๊ฐ„ ์ „์— ๋‚จ์•„์žˆ๋Š” ์น˜์ฆˆ์˜ ๊ฐœ์ˆ˜" ๋ฅผ ์ถœ๋ ฅ๊ฐ€๋Šฅ
    

    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๊ฐœ์˜ ๋Œ“๊ธ€