문제
3184번: 양
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
www.acmicpc.net
알고리즘
- dfs 탐색을 통해 문제를 수행한다.
- 재귀 허용 깊이를 늘리지 않으면 런타임 에러가 나올 수 있다.
[baekjoon] 백준 16956번(파이썬): 늑대와 양
문제 16956번: 늑대와 양 크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는
fre2-dom.tistory.com
- 위 문제와 비슷한 내용이지만 위 문제는 bfs로 풀었고, 이번에는 dfs 탐색을 통해 풀었다.
- 각 영역의 있는 양의 수와 늑대의 수를 비교하고 이긴 동물의 수를 카운트한다.
코드
import sys
sys.setrecursionlimit(10 ** 6) # 재귀 허용 깊이를 수동으로 늘려주는 코드
# 재귀 허용 깊이를 늘리지 않으면 런타임 에러가 나올 수 있음.
# dfs 탐색
def dfs(x, y):
if -1 >= x or x >= r or -1 >= y or y >= c:
return False
# 울타리가 아니라면
if graph[x][y] != '#':
# 늑대의 개수 체크
if graph[x][y] == 'v':
v.append(1)
# 양의 개수 체크
elif graph[x][y] == 'o':
o.append(1)
graph[x][y] = '#'
# 상/하/좌/우를 재귀적으로 탐색
dfs(x + 1, y)
dfs(x - 1, y)
dfs(x, y + 1)
dfs(x, y - 1)
return True
return False
r, c = map(int, sys.stdin.readline().split())
# 그래프 표현
graph = [list(map(str, sys.stdin.readline().strip())) for _ in range(r)]
o = [] # 각 구역의 있는 양
v = [] # 각 구역의 있는 늑대
sheep = 0 # 살아남은 양
wolf = 0 # 살아남은 늑대
for i in range(r):
for j in range(c):
# 울타리가 아니라면 dfs 탐색
if graph[i][j] != '#':
dfs(i, j)
# 각 영역을 탐색후 늑대의 수가 양보다 같거나 크면 살아남은 늑대에 더해준다.
if len(v) >= len(o):
wolf += len(v)
# 반대로 양의 수가 크면 살아있는 양에 더해준다.
else:
sheep += len(o)
# 각 구역의 양과 늑대의 수를 초기화
v = []
o = []
print(sheep, wolf)
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 1446번(파이썬): 지름길 (0) | 2021.08.23 |
---|---|
[baekjoon] 백준 17086번(파이썬): 아기 상어 2 (2) | 2021.08.22 |
[baekjoon] 백준 15900번(파이썬): 나무 탈출 (0) | 2021.08.20 |
[baekjoon] 백준 18405번(파이썬): 경제적 전염 (0) | 2021.08.19 |
[baekjoon] 백준 14716번(파이썬): 현수막 (0) | 2021.08.18 |