본문 바로가기
Beakjun_Solve/BFS, DFS

#재귀함수 DFS #1012 유기농 배추

by CodingStriker 2024. 2. 22.
반응형
import sys
sys.setrecursionlimit(10000)
input = sys.stdin.readline

def dfs(x, y):
    # 주어진 좌표가 배추밭의 범위를 벗어나면 종료
    if x < 0 or x >= N or y < 0 or y >= M:
        return False
   
    # 현재 좌표에 배추가 없으면 종료
    if field[x][y] == 0:
        return False
   
    # 현재 좌표에 이미 방문한 경우 종료
    if visited[x][y]:
        return False
   
    # 현재 좌표 방문 표시
    visited[x][y] = True
   
    # 상하좌우 방향으로 DFS 호출
    dfs(x - 1, y)
    dfs(x + 1, y)
    dfs(x, y - 1)
    dfs(x, y + 1)
   
    return True

T = int(input())  # 테스트 케이스의 개수

for _ in range(T):
    M, N, K = map(int, input().split())  # 가로, 세로, 배추의 개수
    field = [[0] * M for _ in range(N)]  # 배추밭 초기화
    visited = [[False] * M for _ in range(N)]  # 방문 여부 초기화
    count = 0  # 배추흰지렁이의 수
   
    # 배추 위치 입력
    for _ in range(K):
        Y, X = map(int, input().split())  # x, y 좌표 순서 변경
        field[X][Y] = 1
   
    # 모든 좌표에 대해 DFS 호출하여 배추 그룹 수 계산
    for i in range(N):
        for j in range(M):
            if dfs(i, j):  # x, y 좌표 순서 변경
                count += 1
   
    print(count)

https://fuzzysound.github.io/sys-setrecursionlimit

 

 

[파이썬 코딩테스트 팁] sys.setrecursionlimit

import sys sys.setrecursionlimit(10 ** 6) 만약 재귀를 사용해서 풀어야 하는 문제라면, 위 코드를 상단에 쓰는 것은 선택이 아닌 필수이다. 파이썬의 기본 재귀 깊이 제한은 1000으로 매우 얕은 편이다. 따

fuzzysound.github.io

import sys
sys.setrecursionlimit(10 ** 6)

만약 재귀를 사용해서 풀어야 하는 문제라면, 위 코드를 상단에 쓰는 것은 선택이 아닌 필수이다. 파이썬의 기본 재귀 깊이 제한은 1000으로 매우 얕은 편이다. 따라서 재귀로 문제를 풀 경우 드물지 않게 이 제한에 걸리게 되는데, 문제는 코딩테스트 환경에서는 에러 메시지를 볼 수 없다는 것이다. 이 함정에 걸린 사람은 원인 미상의 런타임 에러를 붙잡고 몇십 분을 각종 테스트케이스를 넣어가며 씨름하겠지만, 그런다고 문제가 잡힐 리 없다. 결국에는 문제를 풀지 못한 채 제출하게 되고 내가 뭘 잘못했지 하는 끝없는 자괴감에 빠지게 되는 것이다.

실제로 올해 여러 번 코딩테스트에 응시하면서 위 코드 없이는 풀 수 없는 문제들을 꽤 많이 봤다. 그중에는 카카오 인턴 코딩테스트 문제도 있었다. 억을하게 문제를 틀리고 싶지 않다면 위 코드를 반드시 숙지해놓아야 할 것이다.

반응형