본문 바로가기
알고리즘 풀이/백준

[백준 1012] 유기농 배추(python)

by char_lie 2023. 3. 3.
반응형

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

 

1012번: 유기농 배추

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

www.acmicpc.net

유기농 배추 문제

인접해있는 칸들로 이루어진 영역이 총 몇개인지 구하는 문제

BFS나 DFS를 이용하면 쉽게 풀 수 있는 문제

 

내가 푼 정답코드

def warm(a,b):
    visited = [[0]*M for _ in range(N)]
    queue = [[a,b]]
    visited[a][b] = 1
    cnt = 0
    while queue:
        cnt += 1
        y, x = queue.pop(0)
        for dy, dx in move:
            ny, nx = y + dy, x + dx
            if 0 <= ny < N and 0 <= nx < M and visited[ny][nx] == 0 and cabbage[ny][nx] != 0:
                visited[ny][nx] = visited[y][x] + 1
                cabbage[ny][nx] = 0 #이후 이어있는 배추 수 안세기 위해 없애주자
                queue.append([ny,nx])
    return cnt


import sys
T = int(sys.stdin.readline())
for case in range(T):
    M, N, K = map(int, sys.stdin.readline().split())
    cabbage = [[0]*M for _ in range(N)]
    for _ in range(K):
        a, b = map(int, sys.stdin.readline().split())
        cabbage[b][a] = 1
    move = [[1,0],[-1,0],[0,1],[0,-1]]
    result = [] # 벌레 마리 수
    for i in range(N):
        for j in range(M):
            if cabbage[i][j] == 1:
                result.append(warm(i,j)) # 해당 지역수를 result에 추가
    print(len(result))

BFS를 활용하여 풀어주었고, 위 코드처럼 도착 지점까지의 거리를 구하는 식의 코드를 사용할 필요는 없지만, 가장 중요한 부분은 이동 할 수 있는 다음 영역을 0으로 초기화 해주는것이다. 그래야 for문을 통해 탐색하면서 다시 같은 영역을 재 탐색하는 일이 없어지기 때문이고, 영역 표시 해주기 위해서 영역 갯수를 cnt로 표시해주었다.

사실 cnt로 할 필요 없이 그냥 위 bfs를 돌리면 처음 만난 1인 지역을 제외하고 전부 0으로 만들기 때문에, 그냥 BFS 이후에 cabbage 내에 있는 1의 갯수를 세도 동일하게 출력 할 수 있을 것이다.


느낀 점

DFS 혹은 BFS를 이용하여 해결 할 수 있는 문제를 연습 중에 풀게된 문제. DFS나 BFS 개념을 알고 있다면 쉽게 접근할 수 있지만, 보통 미로 찾는 문제만 해결했지, 이렇게 떨어진 영역 칸 수의 갯수를 찾는 문제는 처음 접해봐서 접근법을 조금 생각해봐야 했단게 좋은 문제였던거 같다.

반응형

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준 7576] 토마토 (python)  (0) 2023.03.04
[백준 2178] 미로 탐색(python)  (0) 2023.03.03
[백준 10431] 줄 세우기(python)  (0) 2023.03.02
[백준 2615] 오목 (python)  (0) 2023.03.02
[백준 1838] 버블 정렬 (python)  (0) 2023.03.01

댓글