백준 > 적록색약

SeiLyn·2024년 2월 18일

백준

목록 보기
15/17

❓ 문제

백준 골드5 문제 > 적록색약

❗ 해결

BFS로 풀었다.

먼저 적록색약이 아닌 사람부터 구하고, 그다음 적록색약인 사람을 구했다.

n = int(input())
board = []

visited = [[0] * n for _ in range(n)]

dic = {'R': 1, 'G': 2, 'B': 3}

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

normal_count = 0
red_green_blind_count = 0

for _ in range(n):
    s = str(input())
    temp_list = []
    for char in s:
        temp_list.append(dic[char])

    board.append(temp_list)

나는 보기 편하게 그냥 숫자로 바꿔줬는데, 그냥 문자열을 숫자로 안바꾸고 풀어도 된다.
내가 한게 비효율적인듯.. 그래도 숫자가 보기 편해서 숫자로 바꿔서 풀었다.

# 적록색약이 아닌 사람
for color in range(1, 4):
    # 1번부터 시작 한다.
    for i in range(n):
        for j in range(n):
            if visited[i][j] == 0 and board[i][j] == color:
                bfs(i, j, color)
                normal_count += 1

그리고 적록색약이 아닌 사람부터 시작한다.
적록색약이 아닌 사람은 RGB를 다 볼수 있으니, 바깥쪽 반복문에서 1,2,3 순서대로 구한다.

def bfs(x, y, color):

    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    queue = deque()
    queue.append([x, y])
    visited[x][y] = 1

    while queue:

        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == 0 and board[nx][ny] == color:
                visited[nx][ny] = 1
                queue.append([nx, ny])

bfs 함수이다.
현재 색상을 파라미터로 넘겨줘서 해당 색상만 찾도록 조건을 걸었다.


# 적록색약인 사람
# 방문한 곳을 체크하는 리스트를 초기화해줌.
visited = [[0] * n for _ in range(n)]

# G(2)면 R(1)로 전부 통일 한다.
for i in range(n):
    for j in range(n):
        if board[i][j] == 2:
            board[i][j] = 1

for color in [1, 3]:
    for i in range(n):
        for j in range(n):
            if visited[i][j] == 0 and board[i][j] == color:
                bfs(i, j, color)
                red_green_blind_count += 1

print(normal_count, red_green_blind_count)

다 찾았으면 적록색약인 사람이 봤을 때 나오는 구역의 수를 구한다.
이때 방문한 곳을 체크하는 리스트는 다시 0으로 초기화를 해주고,
적록색약인 사람은 R,G를 구분하지 못하므로 G를 R로 바꿔주었다 ( 2-> 1 )

그리고 똑같이 bfs 함수를 실행한다.

전체코드

from collections import deque

def bfs(x, y, color):

    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    queue = deque()
    queue.append([x, y])
    visited[x][y] = 1

    while queue:

        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == 0 and board[nx][ny] == color:
                visited[nx][ny] = 1
                queue.append([nx, ny])


n = int(input())
board = []

visited = [[0] * n for _ in range(n)]

dic = {'R': 1, 'G': 2, 'B': 3}


normal_count = 0
red_green_blind_count = 0

for _ in range(n):
    s = str(input())
    temp_list = []
    for char in s:
        temp_list.append(dic[char])

    board.append(temp_list)

# 적록색약이 아닌 사람
for color in range(1, 4):
    # 1번부터 시작 한다.
    for i in range(n):
        for j in range(n):
            if visited[i][j] == 0 and board[i][j] == color:
                bfs(i, j, color)
                normal_count += 1

# 적록색약인 사람
# 방문한 곳을 체크하는 리스트를 초기화해줌.
visited = [[0] * n for _ in range(n)]

# G(2)면 R(1)로 전부 통일 한다.
for i in range(n):
    for j in range(n):
        if board[i][j] == 2:
            board[i][j] = 1

for color in [1, 3]:
    for i in range(n):
        for j in range(n):
            if visited[i][j] == 0 and board[i][j] == color:
                bfs(i, j, color)
                red_green_blind_count += 1

print(normal_count, red_green_blind_count)

0개의 댓글