반응형
250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 유니온 파인드
- 프로그래머스 고득점 kit
- 코딩 교육
- React
- 삼성청년sw아카데미
- SSAFY 8기
- dfs
- ssafy 7기
- SSAFY
- 알고리즘
- SSAFYcial
- 전이학습
- SWEA
- DenseNet
- 백준7576 bfs
- 이코테
- 코딩교육
- git
- 웹 표준 사이트 만들기
- 싸피 7기 입학식
- DP
- ssafy 7기 합격
- 삼성 청년 SW 아카데미
- 프로그래머스
- SSAFY 입학식
- ssafy 7기 교수님
- bfs
- 백준
- pytorch
- Learning
Archives
- Today
- Total
개미의 개열시미 프로그래밍
[알고리즘] 백준 1012 유기농 배추 - 파이썬 본문
728x90
반응형
기말고사 시즌이지만 시험공부가 너무 하기싫어서 한문제 더풀었다.. 처음에는 쉽게 풀리는 듯 했으나 이상하게 입력으로 가로, 세로 바꿔놓으면 헷갈린다.. 문제에서 가로를 m, 세로를 n으로 입력 받게 되어 있다. 난 아무생각없이 가로를 n 세로를 m으로 입력받고 혼자 중간에 패닉에 빠졌다..
https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
풀이코드
1. DFS풀이
from sys import stdin
import sys
sys.setrecursionlimit(10**9)
t = int(input()) # 테스트케이스 2개
result_list = []
def make_graph(m, n, k):
graph = [[0] * m for _ in range(n)]
for _ in range(k):
x, y = map(int, stdin.readline().split())
graph[y][x] = 1
return graph
def dfs(y, x):
if x <= -1 or x >= m or y <= -1 or y >= n:
return False
if graph[y][x] == 1:
graph[y][x] = 0
dfs(y-1, x)
dfs(y+1, x)
dfs(y, x-1)
dfs(y, x+1)
return True
return False
for _ in range(t):
result = 0
m, n, k = map(int, stdin.readline().split())
graph = make_graph(m, n, k)
for i in range(n):
for j in range(m):
if dfs(i,j) == True:
result += 1
result_list.append(result)
print(*result_list, sep='\n')
풀이코드를 dfs버전과 bfs버전을 둘 다 돌려봤다. 지문을 보자마자 dfs로 풀면 쉽게 풀리겠다 생각했지만 런타임 에러 (RecursionError) 가 나왔다. 찝찝하기도 해서 bfs로 다시 풀었고 중간에 막혀서 다른 블로그를 참조했다.
2. BFS풀이
# bfs풀이
from collections import deque
from sys import stdin
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
t = int(input()) # 테스트케이스 2개
result_list = []
def make_graph(m, n, k):
graph = [[0] * m for _ in range(n)]
for _ in range(k):
x, y = map(int, stdin.readline().split())
graph[y][x] = 1
return graph
def bfs(y, x):
queue = deque([])
queue.append([y, x])
while queue:
y, x = queue.pop()
for d in range(4):
xx = dx[d] + x
yy = dy[d] + y
if 0 <= xx < m and 0 <= yy < n:
if graph[yy][xx] == 1:
graph[yy][xx] = 0
queue.append([yy, xx])
for _ in range(t):
result = 0
m, n, k = map(int, stdin.readline().split()) # m:가로, n:세로
graph = make_graph(m, n, k)
for i in range(n): # 세로
for j in range(m): # 가로
if graph[i][j] == 1:
bfs(i, j)
result += 1
result_list.append(result)
print(*result_list, sep='\n')
728x90
반응형
'알고리즘 > DFS, BFS, 백트래킹' 카테고리의 다른 글
[알고리즘] 백준7576 토마토 - 파이썬 (0) | 2021.06.04 |
---|---|
[알고리즘] 백준2178 미로탐색 - 파이썬 (0) | 2021.06.02 |
[알고리즘] 백준 2667 단지번호붙이기 - 파이썬 (0) | 2021.06.01 |
[알고리즘] 백준 2606 바이러스 - 파이썬 (2) | 2021.05.31 |
[알고리즘] 백준 1260 DFS와 BFS - 파이썬 (0) | 2021.05.30 |
Comments