|
1 | 1 | from collections import deque |
2 | 2 |
|
3 | | -# 2차원 배열을 이용한 bfs 구현 |
4 | | -def bfs(x, y): |
| 3 | +dx = [-1, 1, 0, 0] |
| 4 | +dy = [0, 0, -1, 1] |
5 | 5 |
|
6 | | - # 2차원 배열에서 현재 노드의 상하좌우를 검사하기 위한 dx와 dy |
7 | | - dx = [0, -1, 0, 1] |
8 | | - dy = [-1, 0, 1, 0] |
9 | 6 |
|
10 | | - # queue를 이용한 bfs 그래프 탐색 |
11 | | - queue.append((x, y)) |
12 | | - visited[x][y] = 1 |
| 7 | +def bfs(graph, visited): |
| 8 | + border = 0 |
| 9 | + queue = deque() |
13 | 10 |
|
| 11 | + # 영역 개수 계산 |
| 12 | + for i in range(1, N + 1): |
| 13 | + for j in range(1, N + 1): |
| 14 | + # 현재 칸을 아직 방문하지 않았다면 현재 칸부터 bfs 탐색 시작 |
| 15 | + if visited[i][j] == 0: |
| 16 | + # 영역 개수 한 개 증가 |
| 17 | + border += 1 |
| 18 | + queue.append((i, j)) |
14 | 19 |
|
15 | | - while queue: |
16 | | - (x, y) = queue.popleft() |
| 20 | + while queue: |
| 21 | + (x, y) = queue.popleft() |
| 22 | + # 방문처리 |
| 23 | + visited[x][y] = 1 |
17 | 24 |
|
18 | | - # queue에서 pop한 현재 노드를 기준으로 상하좌우 탐색 |
19 | | - for k in range(4): |
20 | | - row = x + dx[k] |
21 | | - col = y + dy[k] |
| 25 | + # 상하좌우 인접한 칸으로 이동 |
| 26 | + for k in range(4): |
| 27 | + nx = x + dx[k] |
| 28 | + ny = y + dy[k] |
22 | 29 |
|
23 | | - # 탐색 조건 |
24 | | - # 1. 현재 노드가 배열의 인덱스 범위 안인지 0 <= x < n and 0 <= y < n |
25 | | - # 2. 같은 색인지 |
26 | | - # 3. 방문하지 않았는지 |
27 | | - if 0 <= row < n and 0 <= col < n: |
28 | | - if arr[x][y] == arr[row][col] and visited[row][col] == 0: |
29 | | - queue.append((row, col)) |
30 | | - visited[row][col] = 1 |
| 30 | + # 칸이 보드 밖으로 넘어가지 않았는지,인접한 칸이 같은 색인지,아직 방문하지 않았는지 확인 |
| 31 | + if (1 <= nx <= N and 1 <= ny <= N) and graph[x][y] == graph[nx][ny] and visited[nx][ny] == 0: |
| 32 | + # 해당 칸 방문처리 |
| 33 | + queue.append((nx, ny)) |
| 34 | + visited[nx][ny] = 1 |
31 | 35 |
|
| 36 | + return border |
32 | 37 |
|
33 | | -# 초기값 세팅 |
34 | | -n = int(input()) |
35 | | -visited = [[0] * n for _ in range(n)] |
36 | | -arr = [list(input()) for _ in range(n)] |
37 | | -queue = deque() |
38 | 38 |
|
39 | | -# 적록색약이 아닌 경우의 답 |
40 | | -answerForNormal = 0 |
| 39 | +# 입력받기 |
| 40 | +N = int(input()) |
| 41 | +graph = [[0] * (N + 1)] |
| 42 | +visited = [[0] * (N + 1) for _ in range(N + 1)] |
41 | 43 |
|
42 | | -# 적록색약인 경우의 답 |
43 | | -answerForColorBlindness = 0 |
| 44 | +for _ in range(N): |
| 45 | + graph.append([0] + list(input())) |
44 | 46 |
|
| 47 | +# 정상인이 보는 영역 개수 반환 |
| 48 | +num_of_normal = bfs(graph, visited) |
45 | 49 |
|
46 | | -# 적록색약이 아닌 경우 |
47 | | -for i in range(n): |
48 | | - for j in range(n): |
49 | | - if visited[i][j] == 0: |
50 | | - bfs(i, j) |
51 | | - answerForNormal += 1 |
| 50 | +# 적록색약이 보는 영역 개수 반환 적록색약은 R,G를 구분하지 못하므로 모든 R을 G로 변환 |
| 51 | +for i in range(1, N + 1): |
| 52 | + for j in range(1, N + 1): |
| 53 | + if graph[i][j] == 'R': |
| 54 | + graph[i][j] = 'G' |
52 | 55 |
|
| 56 | +visited = [[0] * (N + 1) for _ in range(N + 1)] |
| 57 | +num_of_abnormal = bfs(graph, visited) |
53 | 58 |
|
54 | | -# 적록색약인 경우 R과 G는 같으므로 |
55 | | - |
56 | | -for i in range(n): |
57 | | - for j in range(n): |
58 | | - if arr[i][j] == 'G': |
59 | | - arr[i][j] = 'R' |
60 | | - |
61 | | -visited = [[0] * n for _ in range(n)] |
62 | | -for i in range(n): |
63 | | - for j in range(n): |
64 | | - if not visited[i][j]: |
65 | | - bfs(i,j) |
66 | | - answerForColorBlindness += 1 |
67 | | - |
68 | | -print(answerForNormal, answerForColorBlindness) |
| 59 | +print(f"{num_of_normal} {num_of_abnormal}") |
0 commit comments