반응형
츄르사려고 코딩하는 코집사입니다.
1. [백준 알고리즘] 백준 3187번 양치기 꿍 파이썬(Python)
1) 문제번호 : 3187번
2) 문제 출처
https://www.acmicpc.net/problem/3187
2. 문제
양치기 꿍은 맨날 늑대가 나타났다고 마을 사람들을 속였지만 이젠 더이상 마을 사람들이 속지 않는다. 화가 난 꿍은 복수심에 불타 아예 늑대들을 양들이 있는 울타리안에 마구 집어넣어 양들을 잡아먹게 했다.
하지만 양들은 보통 양들이 아니다. 같은 울타리 영역 안의 양들의 숫자가 늑대의 숫자보다 더 많을 경우 늑대가 전부 잡아먹힌다. 물론 그 외의 경우는 양이 전부 잡아먹히겠지만 말이다.
꿍은 워낙 똑똑했기 때문에 이들의 결과는 이미 알고있다. 만약 빈 공간을 '.'(점)으로 나타내고 울타리를 '#', 늑대를 'v', 양을 'k'라고 나타낸다면 여러분은 몇 마리의 양과 늑대가 살아남을지 계산할 수 있겠는가?
단, 울타리로 막히지 않은 영역에는 양과 늑대가 없으며 양과 늑대는 대각선으로 이동할 수 없다.
3. 제약사항
4. 입력
입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다.
다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.
5. 출력
살아남게 되는 양과 늑대의 수를 각각 순서대로 출력한다.
6. 풀이
- DFS 풀었는데, Recursion Error가 발생해서, BFS로 다시 풀었다.
7. 소스 코드
import sys
input=sys.stdin.readline
R, C = map(int, input().split()) # 세로와 가로의 길이
board = []
# 방문체크
visit = [[0] * C for _ in range(R)]
#입력
for _ in range(R) :
board.append(list(input().rstrip()))
# 상, 하, 좌, 우
dx = [-1,1,0,0]
dy = [0,0,-1,1]
queue = []
def BFS(x,y) :
global w, s
visit[x][y] = 1
queue.append([x,y])
while queue :
x, y = queue[0][0], queue[0][1]
del queue[0]
# 늑대면 a 1 증가
if board[x][y] == "v":
w += 1
# 양이면 b 1 증가
elif board[x][y] == "k":
s += 1
# 4방 탐색
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# 범위 안에 있고, #이 아니고 방문을 하지 않았으면
if 0 <= nx < R and 0 <= ny < C and board[nx][ny] != "#" and visit[nx][ny] == 0:
queue.append([nx,ny])
visit[nx][ny] = 1
wolf = 0 # 총 양의 마리수
sheep = 0 # 총 늑대의 마리수
for i in range(R) :
for j in range(C) :
if board[i][j] != "#" and visit[i][j]==0:
w = 0
s = 0
BFS(i,j)
if w >= s :
s = 0
else :
w = 0
wolf += w
sheep += s
print(sheep, wolf)
- DFS
import sys
input=sys.stdin.readline
R, C = map(int, input().split()) # 세로와 가로의 길이
board = []
# 방문체크
visit = [[0] * C for _ in range(R)]
#입력
for _ in range(R) :
board.append(list(input().rstrip()))
# 상, 하, 좌, 우
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def DFS(x,y) :
global w, s
visit[x][y] = 1
# 늑대면 a 1 증가
if board[x][y] == "v" :
w += 1
# 양이면 b 1 증가
elif board[x][y] == "k" :
s += 1
# 4방 탐색
for i in range(4) :
nx = x + dx[i]
ny = y + dy[i]
# 범위 안에 있고, #이 아니고 방문을 하지 않았으면 DFS 돌자
if 0<=nx<R and 0<=ny<C and board[nx][ny]!="#" and visit[nx][ny] == 0 :
DFS(nx, ny)
wolf = 0 # 총 양의 마리수
sheep = 0 # 총 늑대의 마리수
for i in range(R) :
for j in range(C) :
if board[i][j] != "#" and visit[i][j]==0:
w = 0
s = 0
DFS(i,j)
if w >= s :
s = 0
else :
w = 0
wolf += w
sheep += s
print(sheep, wolf)
반응형
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘] 백준 3184번 양 파이썬(Python) (0) | 2021.06.12 |
---|---|
[백준 알고리즘] 백준 15720번 카우버거 파이썬(Python) (0) | 2021.06.11 |
[백준 알고리즘] 백준 6996번 애너그램 파이썬(Python) (0) | 2021.06.11 |
[백준 알고리즘] 백준 5576번 콘테스트 파이썬(Python) (0) | 2021.06.11 |
[백준 알고리즘] 백준 9372번 상근이의 여행 파이썬(Python) (0) | 2021.06.11 |
[백준 알고리즘] 백준 21867번 Java Bitecode 파이썬(Python) (0) | 2021.06.10 |
[백준 알고리즘] 백준 21866번 추첨을 통해 커피를 받자 파이썬(Python) (0) | 2021.06.10 |
[백준 알고리즘] 백준 16174번 점프왕 쩰리 (Large) 파이썬(Python) (0) | 2021.06.10 |
최근댓글