Skip to content

Commit d32adb7

Browse files
committed
[BOJ] 적록색약 / 골드 5 / 45분(이전에 풀었던 문제인데 다시 풀어봄)
https://www.acmicpc.net/problem/10026
1 parent 0456ec3 commit d32adb7

File tree

1 file changed

+43
-52
lines changed

1 file changed

+43
-52
lines changed
Lines changed: 43 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,59 @@
11
from collections import deque
22

3-
# 2차원 배열을 이용한 bfs 구현
4-
def bfs(x, y):
3+
dx = [-1, 1, 0, 0]
4+
dy = [0, 0, -1, 1]
55

6-
# 2차원 배열에서 현재 노드의 상하좌우를 검사하기 위한 dx와 dy
7-
dx = [0, -1, 0, 1]
8-
dy = [-1, 0, 1, 0]
96

10-
# queue를 이용한 bfs 그래프 탐색
11-
queue.append((x, y))
12-
visited[x][y] = 1
7+
def bfs(graph, visited):
8+
border = 0
9+
queue = deque()
1310

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))
1419

15-
while queue:
16-
(x, y) = queue.popleft()
20+
while queue:
21+
(x, y) = queue.popleft()
22+
# 방문처리
23+
visited[x][y] = 1
1724

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]
2229

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
3135

36+
return border
3237

33-
# 초기값 세팅
34-
n = int(input())
35-
visited = [[0] * n for _ in range(n)]
36-
arr = [list(input()) for _ in range(n)]
37-
queue = deque()
3838

39-
# 적록색약이 아닌 경우의 답
40-
answerForNormal = 0
39+
# 입력받기
40+
N = int(input())
41+
graph = [[0] * (N + 1)]
42+
visited = [[0] * (N + 1) for _ in range(N + 1)]
4143

42-
# 적록색약인 경우의 답
43-
answerForColorBlindness = 0
44+
for _ in range(N):
45+
graph.append([0] + list(input()))
4446

47+
# 정상인이 보는 영역 개수 반환
48+
num_of_normal = bfs(graph, visited)
4549

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'
5255

56+
visited = [[0] * (N + 1) for _ in range(N + 1)]
57+
num_of_abnormal = bfs(graph, visited)
5358

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

Comments
 (0)