Problem Solving/Python
[백준] 1012 - 유기농 배추 (dfs 풀이) (python)
TakeKnowledge
2023. 7. 7. 13:33
반응형

https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
포인트
dfs 혹은 bfs 로 쉽게 풀 수 있는 문제입니다.
대신 두 알고리즘에 대해 잘 모른다면 풀기 어렵기 때문에 모른다면 이 참에 숙지해둡시다
탐색 알고리즘 DFS (깊이 우선 탐색) 와 BFS (너비 우선 탐색) (python)
- 개념 DFS (깊이 우선 탐색) 와 BFS(너비 우선 탐색) 는 대표적인 탐색 알고리즘입니다. 동작하는 방식은 이름 그대로입니다. 위와 같이 그래프 형태로 데이터를 정렬했을 때 깊이 탐색을 우선하는
takeknowledge.tistory.com
저는 dfs로 풀었습니다
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 백준 채점 시스템의 최대 재귀 깊이는 1000으로 세팅되어있어 10000으로 넉넉히 늘려주는 게 좋습니다. | |
import sys | |
sys.setrecursionlimit(10000) | |
# dfs 함수를 정의합니다. | |
def dfs(r, c): | |
# 범위를 벗어나거나 배추가 심어져있지 않은 땅이거나 이미 카운트 한 땅은 패스 | |
if r < 0 or c < 0 or r >= n or c >= m: | |
return False | |
if ground[r][c] == 0: | |
return False | |
# 배추가 심어져 있으면 | |
if ground[r][c] == 1: | |
# 중복하여 세지 않도록 0으로 돌려주고 상하좌우로 dfs 재귀 함수 출발 | |
ground[r][c] = 0 | |
dfs(r + 1, c) | |
dfs(r - 1, c) | |
dfs(r, c + 1) | |
dfs(r, c - 1) | |
# 다 돌고 나면 True 를 리턴하도록합니다 | |
return True | |
return False | |
# 테스트 케이스 입력받고 | |
t = int(input()) | |
# 그만큼 돌면서 | |
for _ in range(t): | |
answer = 0 | |
# 가로 세로 갯수 입력받아 2차원 배열로 땅 구성하고 | |
m, n, k = map(int, input().split()) | |
ground = [[0 for _ in range(m)] for _ in range(n)] | |
# 배추 심어져 있는 위치 표시한 다음 | |
for _ in range(k): | |
x, y = map(int, input().split()) | |
ground[y][x] = 1 | |
# 왼쪽 끝 부터 쭉 돌면서 dfs 출발 | |
for i in range(n): | |
for j in range(m): | |
# True 를 리턴하는 경우는 그 지점에 배추가 심겨져 있었고 상하좌우까지 모두 확인한 경우란 말이기 때문에 | |
if dfs(i, j): | |
# 영역의 개수를 하나 올려줍니다 | |
answer += 1 | |
print(answer) | |
반응형