Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](BFS) 백준 10026번 : 적록색약 본문
728x90
<접근 방법>
- 적록색약이 아닌 사람과 적록색약인 사람이 인지하는 구역이 다르므로 각각의 상황에 맞는 BFS를 2개 만들어야겠다.
- 적록색약이 아닌 사람의 경우, 미방문된 구역을 bfs를 통해 같은 색깔끼리 하나의 덩어리로 계산하도록 하고,
적록색약인 사람의 경우, 미방문된 구역을 bfs를 통해 R이나 G일 경우 서로가 같은 색으로 인식될 수 있게 계산한다.
from collections import deque
def bfs(si, sj): # 적록색약이 아닌 사람의 경우
visited[si][sj] = 1
q = deque()
q.append((si, sj))
while q:
ci, cj = q.popleft()
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<N and not visited[ni][nj] and board[ni][nj] == board[si][sj]:
q.append((ni, nj))
visited[ni][nj] = 1
def bbfs(si, sj): # 적록색약인 사람의 경우
visited[si][sj] = 1
q = deque()
q.append((si, sj))
# R이나 G가 덩어리의 기준일 경우
if board[si][sj] == 'R' or board[si][sj] == 'G':
while q:
ci, cj = q.popleft()
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<N and not visited[ni][nj] and (board[ni][nj] == 'R' or board[ni][nj] == 'G'):
q.append((ni, nj))
visited[ni][nj] = 1
else: # B가 덩어리의 기준일 경우
while q:
ci, cj = q.popleft()
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<N and not visited[ni][nj] and board[ni][nj] == 'B':
q.append((ni, nj))
visited[ni][nj] = 1
N = int(input())
board = [list(input())for _ in range(N)]
# 적록색약이 아닌 사람의 경우
count_1 = 0
visited = [[0]*N for _ in range(N)]
for i in range(N):
for j in range(N):
if not visited[i][j]:
count_1 += 1
bfs(i, j)
# 적록색약인 사람의 경우
count_2 = 0
visited = [[0]*N for _ in range(N)]
for i in range(N):
for j in range(N):
if not visited[i][j]:
count_2 += 1
bbfs(i, j)
print(count_1, count_2)
이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'BFS & DFS' 카테고리의 다른 글
[Python](BFS) 백준 18405번 : 경쟁적 전염 (0) | 2024.01.30 |
---|---|
[Python](DFS/백트래킹) 백준 1759번 : 암호 만들기 (2) | 2024.01.29 |
[Python](BFS) 백준 7569번 : 토마토 (0) | 2024.01.20 |
[Python](BFS) 백준 7576번 : 토마토 (0) | 2024.01.11 |
[Python](BFS) 백준 2178번 : 미로 탐색 (2) | 2024.01.10 |