본문 바로가기

개발/Algorithm

[Algorithm] 백준 BOJ 1012 유기농 배추 python 파이썬 그래프 실버 2

Private 난이도 : ♥♥♥♡♡
 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

import sys
sys.setrecursionlimit(10000)
def dfs(x, y, graph):
    if x < 0 or x >= m or y >= n or y < 0:  # 탈출조건
        return False

    if graph[y][x] == 1:
        graph[y][x] = 0
        dfs(x + 1, y, graph)
        dfs(x - 1, y, graph)
        dfs(x, y + 1, graph)
        dfs(x, y - 1, graph)

        return True
    else:
        return False


t = int(sys.stdin..readline().strip())  # 테스트 케이스의 개수
for tt in range(t):
    m, n, k = map(int, sys.stdin..readline().strip().split())  # m,n,k-> 가로 세로 배추가심어진위치의개수

    graph = [[0] * m for _ in range(n)]
    for kk in range(k):
        x, y = map(int, sys.stdin..readline().strip().split())
        graph[y][x] = 1
    # 데이터 받기 끝
    for y in range(n):# 그래프 전체 모양 보기
        print(graph[y])


    result = 0  # 필요한 최소의 지렁이 마리 수 저장 변수
    for y in range(n):
        for x in range(m):
            if dfs(x, y, graph) == True:
                result += 1
    print(result)

위는 설명을 추가한 것이고, 제출은 이렇게 했습니다.

설명

  • 이코테 3강 유튜브에 나온 문제 얼음 얼려 먹기 였나 그거랑 너무 비슷했다. 그 때는 설명만 들어서 위의 사진에서 15번과 18번에서도 true가 나오는데 왜 1이 안 더해지는지도 이상했고, 2번같은 것도 return false인데 왜 되는걸까 고민했었다. 근데 그림 그리니까 확실히 이해가 갔다.
    • return true, return false는 말 그대로 값을 돌려주는 건데 그걸 받아서 쓰는데가 없으면 그대로 날아간다. 그니까 if dfs(x,y,graph)==True: 일 때 return되는 값들 이외에 중간에 돌려받는 값들은 필요가 없고 다 그냥 공중으로 분해된다.
  • 완전 기본적인 문제인 것 같은데, 이건 dict보다는 그림처럼 list를 만드는 것이 쉽다
  • x,y 랑 m,n이랑 잘 맞춰야 한다. 엄청 헷갈렸다. -> indexerror가 다 여기서 났었다.

배운 점

  • RecursionError
    파이썬은 1000인가까지만 재귀함수가 저장되서 그 이상이 되면 이 에러가 뜬다 2번째 줄과 같은 코드를 넣으면 해결되긴한다. sys.recursionlimit(10000)
  • 이해 안되면 프린트하고 그리는게 답이다