ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (백준) 1012번 유기농 배추
    CS/Algorithm 2025. 1. 2. 13:46
    반응형

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

     

    이 문제는 구역 구하기 문제로 dfs로 쉽게 구현 할 수 있는 문제이다.

     

    DFS

    DFS는 깊이 우선 탐색으로 이름만 들으면 아래로 깊이 있게 내려간다는 건가라고 생각할 수 있지만, 그게 아니라 한쪽 방향으로 끈질기게 

    계속 파고 들어가는 탐색 방식을 말한다.

    즉, 상,하,좌,우가 있을때 위로 이동했으면 또 다시 상,하,좌,우를 탐색하고 끝이 있을 때까지 쭉 이동하는 방식인 것이다.

    만약 끝이 보일 경우 다시 이전단계로 돌아와서 다음 가능한 여부를 파악한다.

    BFS는 그저 인접한 노드로만 이동하기 때문에 그 점에서 차이가 존재한다.

     

    또한 DFS는 스택으로 구현하지만, 재귀함수를 사용한다면 더 간단하게 구현할 수 있다. 그래서 굳이 스택을 사용하지 않아도 된다.

     

    import sys
    
    #재귀 깊이를 제한: 배추밭의 크기가 50x50 = 2500이면 최악의 경우 2500번 이상 재귀를 호출해야 할 수 있는데
    #파이썬의 경우 기본적으로 재귀함수는 1000번까지만 제한하기 때문에 늘려줄 필요가 있다.
    sys.setrecursionlimit(10000)
    
    T = int(input()) #테스트 케이스 입력
    
    def dfs(x,y):
        #지정된 구역을 벗어났을 경우
        if x < 0 or x >= m or y < 0 or y >= n:
            return False
        #해당 구역에 배추가 있는 경우
        if field[y][x] == 1:
            field[y][x] = 0 #방문처리
            
            #재귀함수로 상하좌우 탐색
            dfs(x+1,y)
            dfs(x-1,y)
            dfs(x,y+1)
            dfs(x,y-1)
            return True
        #배추가 없는 경우    
        return False        
    
    #입력 받기
    for _ in range(T):
        m, n , k = map(int, input().split()) #배추 밭의 크기와 배추 개수 입력
    
        field = [[0] * m for _ in range(n)] # 가로 M, 세로 N 만큼의 0으로 초기화 된 배추밭 만들기
    
        for _ in range(k):
            X,Y = map(int, input().split())
            field[Y][X] = 1 #배추가 있는 곳을 1로 초기화
    
        result = 0
        for i in range(n):
            for j in range(m):
                if dfs(j,i):
                    result +=1
    
        print(result)

     

    이 코드에서 주의할점은 다음과 같다.

     

    1.sys.setrecursionlimit(10000)을 설정한 이유는 파이썬의 기본 재귀함수 제한 범위는 1000까지인데 
    문제의 경우 50x50의 배추밭에 모든 배추가 존재하는 경우 최악의 경우 재귀함수가 1000을 넘어갈 수 있기 때문이다.

    2. 2차원 배열과 실제 x,y좌표계는 다르다.

    이차원 배열은 [세로][가로]로 구성되어 있기 때문

    접근할때 [j][i] 이렇게 반대로 접근해야하며, 우리가 생각하는 x,y좌표계와는 반대로 뒤집힌 형태의 좌표계가 구성이 된다.

    허나, 문제를 풀때 상대적 위치는 같으므로 굳이 수정할 필요가 없었다.

    반응형

    'CS > Algorithm' 카테고리의 다른 글

    (백준) 7576: 토마토  (0) 2025.01.03
    (백준)2346  (1) 2024.08.24
    (백준)4949- rstrip() vs strip()  (0) 2024.08.22
    (백준) 9012  (2) 2024.08.20
    (백준)1929번 에라토스테네스의 체 알고리즘  (4) 2024.08.15
Designed by Tistory.