▶ 문제 탐색하기
재귀함수를 이용해서 최소한 점프할 수 있는 방법을 탐색한다.
◇ 입력
- 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
- 둘째 줄부터 N개 줄에는 그림이 주어진다.
◇ 원하는 출력 조건
- 적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.
가능한 시간복잡도
알고리즘 선택
- BFS 알고리즘 사용
▶ 코드 설계하기
▶ 회차별 수정사항
▶ 정답 코드
import sys
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
N = int(sys.stdin.readline())
graph = []
for _ in range(N):
graph.append(list(sys.stdin.readline().strip()))
def bfs(x, y):
queue = [(x, y)]
visited[x][y] = True
now = graph[x][y]
while queue:
x, y = queue.pop()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= N:
continue
if not visited[nx][ny] and graph[nx][ny] == now:
visited[nx][ny] = True
queue.append((nx, ny))
visited = [[False for _ in range(N)] for _ in range(N)]
not_blind = 0
for i in range(N):
for j in range(N):
if not visited[i][j]:
not_blind += 1
bfs(i,j)
visited = [[False for _ in range(N)] for _ in range(N)]
for i in range(N):
for j in range(N):
if graph[i][j] == 'G':
graph[i][j] = 'R'
blind = 0
for i in range(N):
for j in range(N):
if not visited[i][j]:
blind += 1
bfs(i,j)
print(not_blind, end = ' ')
print(blind)
▶ 추가 풀이
'코딩테스트 > BOJ' 카테고리의 다른 글
[백준] 2096: 내려가기 (DP, 파이썬) (0) | 2024.10.14 |
---|---|
[백준] 14430: 자원 캐기 (파이썬) (0) | 2024.10.12 |
[백준]27737번: 버섯농장 (0) | 2024.10.10 |
[백준] 1326: 폴짝폴짝 (파이썬) (0) | 2024.10.07 |
[백준] 2805: 나무 자르기 (파이썬, 이분 탐색) (0) | 2024.09.23 |