[Silver II] 양 한마리... 양 두마리... - 11123
성능 요약
메모리: 34112 KB, 시간: 448 ms
분류
너비 우선 탐색(bfs), 깊이 우선 탐색(dfs), 그래프 이론(graphs), 그래프 탐색(graph_traversal)
문제 설명
얼마전에 나는 불면증에 시달렸지... 천장이 뚫어져라 뜬 눈으로 밤을 지새우곤 했었지. 그러던 어느 날 내 친구 광민이에게 나의 불면증에 대해 말했더니 이렇게 말하더군. "양이라도 세봐!" 정말 도움이 안되는 친구라고 생각했었지. 그런데 막상 또 다시 잠을 청해보려고 침대에 눕고 보니 양을 세고 있더군... 그런데 양을 세다보니 이걸로 프로그램을 하나 짜볼 수 있겠단 생각이 들더군 후후후... 그렇게 나는 침대에서 일어나 컴퓨터 앞으로 향했지.
양을 # 으로 나타내고 . 으로 풀을 표현하는 거야. 서로 다른 # 두 개 이상이 붙어있다면 한 무리의 양들이 있는거지. 그래... 좋았어..! 이걸로 초원에서 풀을 뜯고 있는 양들을 그리드로 표현해 보는거야!
그렇게 나는 양들을 그리드로 표현하고 나니까 갑자기 졸렵기 시작했어. 하지만 난 너무 궁금했지. 내가 표현한 그 그리드 위에 몇 개의 양무리가 있었는지! 그래서 나는 동이 트기 전까지 이 프로그램을 작성하고 장렬히 전사했지. 다음날 내가 잠에서 깨어났을 때 내 모니터에는 몇 개의 양무리가 있었는지 출력되어 있었지.
입력
첫 번째 줄은 테스트 케이스의 수를 나타나는 T를 입력받는다.
이후 각 테스트 케이스의 첫 번째 줄에서는 H,W 를 입력받는다. H는 그리드의 높이이고, W는 그리드의 너비이다. 이후 그리드의 높이 H 에 걸쳐서 W개의 문자로 이루어진 문자열 하나를 입력받는다.
- 0 < T ≤ 100
- 0 < H, W ≤ 100
출력
각 테스트 케이스마다, 양의 몇 개의 무리로 이루어져 있었는지를 한 줄에 출력하면 된다.
풀이방법
BFS well known 문제.
1. 그리드 전체를 탐색하면서 양(#)이 있는 공간을 만나면 방문체크("#" => ".") 후 bfs 탐색을 실행한다.
1-1. bfs 함수 : 큐가 빌 때 까지 상하좌우를 탐색하며 주변에 있는 양을 모두 방문체크("#" => ".")
2. 실행한 횟수(cnt)를 증가시킨다.
3. 횟수 출력
from collections import deque
t = int(input())
dx, dy = (1,-1,0,0), (0,0,1,-1)
for _ in range(t):
graph = []
cnt = 0
x, y = map(int,input().split())
def bfs(a,b):
graph[a][b] = "."
q = deque()
q.append((a,b))
while q:
u,v = q.popleft()
for k in range(4):
nx, ny = dx[k] + u, dy[k] + v
if 0 <= nx < x and 0 <= ny < y:
if graph[nx][ny] == "#":
graph[nx][ny] = '.'
q.append((nx,ny))
for _ in range(x):
graph.append(list(input()))
for i in range(x):
for j in range(y):
if graph[i][j] == "#":
bfs(i,j)
cnt += 1
print(cnt)
'알고리즘' 카테고리의 다른 글
[Gold III] 싸지방에 간 준하 - 12764 (우선순위큐, 자료구조) (4) | 2023.02.01 |
---|---|
[Silver I] 연산자 끼워넣기 - 14888 (백트래킹, 브루트포스) (3) | 2023.01.31 |
[Silver I] RGB거리 - 1149 (DP) (2) | 2023.01.30 |
[Silver III] 게임 - 1072 (이분탐색) (3) | 2023.01.29 |
[Gold V] 탑 - 2493 (스택, 자료 구조) : java, python (1) | 2023.01.28 |