| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 다이나믹프로그래밍
- 알고리즘
- 백준
- 백준 #알고리즘 #파이썬 #코딩테스트
- PYTHON
- java #자바 #나동빈
- 투포인터
- 파이썬 #백준 #알고리즘 #코딩테스트
- 재귀
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 농구
- Dijkstra
- java #자바
- 코딩테스트
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- DFS
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- css #웹 #생활코딩
- dp
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- css #생활코딩 #웹
- 자바 #java
- 백준 #파이썬 #알고리즘 #코딩테스트
- BFS
- 다익스트라
- java #자바 #동빈나
- 파이썬
- java #자바 #생활코딩
- 백트랙킹
- 프로그래머스
- Today
- Total
커리까지
[백준] 11123번 양 한마리... 양 두마리... 파이썬 본문
문제
얼마전에 나는 불면증에 시달렸지... 천장이 뚫어져라 뜬 눈으로 밤을 지새우곤 했었지. 그러던 어느 날 내 친구 광민이에게 나의 불면증에 대해 말했더니 이렇게 말하더군. "양이라도 세봐!" 정말 도움이 안되는 친구라고 생각했었지. 그런데 막상 또 다시 잠을 청해보려고 침대에 눕고 보니 양을 세고 있더군... 그런데 양을 세다보니 이걸로 프로그램을 하나 짜볼 수 있겠단 생각이 들더군 후후후... 그렇게 나는 침대에서 일어나 컴퓨터 앞으로 향했지.
양을 # 으로 나타내고 . 으로 풀을 표현하는 거야. 서로 다른 # 두 개 이상이 붙어있다면 한 무리의 양들이 있는거지. 그래... 좋았어..! 이걸로 초원에서 풀을 뜯고 있는 양들을 그리드로 표현해 보는거야!
그렇게 나는 양들을 그리드로 표현하고 나니까 갑자기 졸렵기 시작했어. 하지만 난 너무 궁금했지. 내가 표현한 그 그리드 위에 몇 개의 양무리가 있었는지! 그래서 나는 동이 트기 전까지 이 프로그램을 작성하고 장렬히 전사했지. 다음날 내가 잠에서 깨어났을 때 내 모니터에는 몇 개의 양무리가 있었는지 출력되어 있었지.
입력
첫 번째 줄은 테스트 케이스의 수를 나타나는 T를 입력받는다.
이후 각 테스트 케이스의 첫 번째 줄에서는 H,W 를 입력받는다. H는 그리드의 높이이고, W는 그리드의 너비이다. 이후 그리드의 높이 H 에 걸쳐서 W개의 문자로 이루어진 문자열 하나를 입력받는다.
- 0 < T ≤ 100
- 0 < H, W ≤ 100
출력
각 테스트 케이스마다, 양의 몇 개의 무리로 이루어져 있었는지를 한 줄에 출력하면 된다.
예제 입력 1
2
4 4
#.#.
.#.#
#.##
.#.#
3 5
###.#
..#..
#.###예제 출력 1
6
3
제출 답안
- dfs가 끝나면 cnt를 1 증가시켜 양 무리 숫자를 늘려 간다.
'''
1. 아이디어
- for loop를 통해 양을 구한다.
2. 시간 복잡도
- O(V+E)
- V : HxW
- E : 4V
= 5V = 5x(100x100)= 50,000 < 2억
3. 자료구조
- int [][]
- bool [][]
'''
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**9)
t = int(input())
answer = []
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
def dfs(y,x):
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if 0<=ny<h and 0<=nx<w:
if not visited[ny][nx] and graph[ny][nx] == '#':
visited[ny][nx] = True
dfs(ny, nx)
for _ in range(t):
h, w = map(int, input().split())
graph = [list(input().strip()) for _ in range(h)]
visited = [[False] * w for _ in range(h)]
cnt = 0
for j in range(h):
for i in range(w):
if not visited[j][i] and graph[j][i] == "#":
visited[j][i] = True
dfs(j, i)
cnt += 1
answer.append(cnt)
cnt = 0
for i in answer:
print(i)'알고리즘 > 풀이' 카테고리의 다른 글
| [백준] 1388번 바닥장식 파이썬 (0) | 2022.12.18 |
|---|---|
| [백준] 24444번 알고리즘 수업 - 너비 우선 탐색 1 파이썬 (1) | 2022.12.17 |
| [백준] 7562번 나이트의 이동 파이썬 (0) | 2022.12.15 |
| [백준] 1260번 DFS와 BFS 파이썬 (0) | 2022.12.14 |
| [백준] 17086번 아기상어2 (0) | 2022.12.13 |