1303번: 전쟁 - 전투
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는
www.acmicpc.net
코드
from collections import deque
n, m = map(int, input().split())
board = [input() for _ in range(m)]
visited = [[False]*n for _ in range(m)]
power = {"W": 0, "B": 0} # 각 나라의 병사의 위력의 합
def bfs(x, y, color):
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
q = deque([(x, y)])
cnt = 1
visited[x][y] = True
while q:
x, y = q.popleft()
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0 <= nx < m and 0 <= ny < n and not visited[nx][ny] and board[nx][ny] == color:
q.append((nx, ny))
visited[nx][ny] = True
cnt += 1
return cnt
for i in range(m):
for j in range(n):
if not visited[i][j]:
power[board[i][j]] += bfs(i, j, board[i][j])**2
print(*power.values())
아직 방문하지 않은 칸에 도착하면 해당 칸에서부터 뭉쳐있는 병사들, 즉 상하좌우로 서로 인접한 아군의 수를 BFS를 이용하여 센다. 기존의 BFS 알고리즘에 같은 색의 병사인지 확인하는 조건만 넣어주면 된다. 그리고 q에 넣을 때마다 그 칸의 병사는 같은 뭉텅이에 속해있다는 뜻이므로 cnt를 1 증가시켜준다.
'문제풀이 > DFS_BFS' 카테고리의 다른 글
[Python/파이썬] 백준 6118번 숨바꼭질 (0) | 2024.05.14 |
---|---|
[Python/파이썬] 백준 14248번 점프 점프 (0) | 2024.05.07 |
[Python/파이썬] 백준 15644번 구슬 탈출 3 (0) | 2024.04.21 |
[Python/파이썬] 백준 17616번 등수 찾기 (0) | 2024.04.18 |
[Python/파이썬] 백준 14923번 미로 탈출 (1) | 2024.04.07 |
1303번: 전쟁 - 전투
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는
www.acmicpc.net
코드
from collections import deque n, m = map(int, input().split()) board = [input() for _ in range(m)] visited = [[False]*n for _ in range(m)] power = {"W": 0, "B": 0} # 각 나라의 병사의 위력의 합 def bfs(x, y, color): dx = [0, 0, -1, 1] dy = [-1, 1, 0, 0] q = deque([(x, y)]) cnt = 1 visited[x][y] = True while q: x, y = q.popleft() for i in range(4): nx = x+dx[i] ny = y+dy[i] if 0 <= nx < m and 0 <= ny < n and not visited[nx][ny] and board[nx][ny] == color: q.append((nx, ny)) visited[nx][ny] = True cnt += 1 return cnt for i in range(m): for j in range(n): if not visited[i][j]: power[board[i][j]] += bfs(i, j, board[i][j])**2 print(*power.values())
아직 방문하지 않은 칸에 도착하면 해당 칸에서부터 뭉쳐있는 병사들, 즉 상하좌우로 서로 인접한 아군의 수를 BFS를 이용하여 센다. 기존의 BFS 알고리즘에 같은 색의 병사인지 확인하는 조건만 넣어주면 된다. 그리고 q에 넣을 때마다 그 칸의 병사는 같은 뭉텅이에 속해있다는 뜻이므로 cnt를 1 증가시켜준다.
'문제풀이 > DFS_BFS' 카테고리의 다른 글
[Python/파이썬] 백준 6118번 숨바꼭질 (0) | 2024.05.14 |
---|---|
[Python/파이썬] 백준 14248번 점프 점프 (0) | 2024.05.07 |
[Python/파이썬] 백준 15644번 구슬 탈출 3 (0) | 2024.04.21 |
[Python/파이썬] 백준 17616번 등수 찾기 (0) | 2024.04.18 |
[Python/파이썬] 백준 14923번 미로 탈출 (1) | 2024.04.07 |