7576 토마토 _python

    https://www.acmicpc.net/problem/7576

     

    7576번: 토마토

    첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

    www.acmicpc.net

     

    색칠공부?

    불편한게 있다면 N과 M을 보통 백준 문제와는 다르게 거꾸로 입력받는다... 아;

     

     

     

     

    문제 풀이

    쿼리도를 만들면서 이동가능한지 체크할때 어떤 알고리즘을 쓸지 고민하다가 Flood fill 이라는 알고리즘을 알게되서 사용했다.

    이 문제를 보자말자 내가 썼던거랑 완전 똑같이 풀면 되겠는데? Flood fill문제네! 했다.

    https://portable-paper.tistory.com/29?category=970607 

     

    [쿼리도 만들기] 3. wall에 Flood Fill적용하기

    할일 닉네임이 보이도록 만들기 piece움직이도록 구현 wall 움직이도록 구현 멀티 + 턴 만들어서 각자 턴에만 움직일 수 있도록 승자 결정후 다시하기 이전 내용은 네이버 블로그에 있음. https://blog

    portable-paper.tistory.com

    하핳

     

    가능한 모든 경우를 색칠해나가는 알고리즘으로 진짜 색칠공부다.

    위키를 보면 이해하기 쉽다.

    https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9F%AC%EB%93%9C_%ED%95%84

     

    플러드 필 - 위키백과, 우리 모두의 백과사전

    위키백과, 우리 모두의 백과사전. 4방향 재귀적 플러드 필 플러드 필(영어: flood fill) 혹은 시드 필(영어: seed fill)은 다차원 배열의 어떤 칸과 연결된 영역을 찾는 알고리즘이다. 이 알고리즘은 그

    ko.wikipedia.org

    굳이 들어가지 않아도 gif로 보이는 색칠하는 과정으로도 충분하고,

    링크안에 queue와 stack으로 구현하는 예시도 있다.

    queue로 구현하는것이 좋다고도 나와있다.

     

     

     

     

    풀이

    from collections import deque
    import sys
    input = sys.stdin.readline
    
    """
    Flood Fill알고리즘 사용
    1. 1이 여러개인 경우가 있으니 1을 찾아서 위치를 append
    2. Flood fill로 모두 색칠
    2-1. 색칠하면서 1씩 더해줌.
    3. 색칠후, 0이 있다면 -1출력, 아니면 max출력
    
    """
    
    #입력, 변수선언
    M, N = map(int,input().split())
    arr = []
    for i in range(N):
        arr.append(list(map(int,input().split())))
    queue = deque()
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    ans = 0
    
    # 1. 1이 여러개인 경우가 있으니 1을 찾아서 위치를 append
    for i in range(N):
        for j in range(M):
            if arr[i][j] == 1:
                queue.append([i,j])
    
    #2. Flood fill로 모두 색칠
    #2-1. 색칠하면서 1씩 더해줌.
    while queue:
        x,y = queue.popleft()
    
        for i in range(4):
            xi = x + dx[i]
            yi = y + dy[i]
            if 0<=xi<N and 0<=yi<M:
                if arr[xi][yi] == 0:
                    arr[xi][yi] = arr[x][y] + 1
                    queue.append([xi,yi])
    
    #3. 색칠후, 0이 있다면 -1출력, 아니면 max출력
    for i in range(N):
        for j in range(M):
            if arr[i][j] == 0:
                ans = -1
        if ans!=-1:
            maxVal = max(*arr[i])-1
            if ans<maxVal:
                ans = maxVal
    
    print(ans)

    2844ms

    pypy3는 588ms

    '백준 > 문제풀이_python' 카테고리의 다른 글

    1743 음식물 피하기 _python  (0) 2022.10.27
    7569 토마토 _python  (0) 2022.10.27
    2178 미로 탐색 _python  (0) 2022.10.27
    16173 점프왕 쩰리(Small) _python  (0) 2022.10.27
    16174 점프왕 쩰리(Large) _python  (0) 2022.10.27

    댓글