BOJ 10026 적록색약

DooDuZ·2024년 6월 10일
0

항해99 취업 리부트

목록 보기
12/14

bfs 두번 돌리기 싫어서 고민을 좀 했지만 좀처럼 생각이 안 나서 나눠서 돌렸다. 색약 구분 변수를 주고 색약인 경우 G를 R로 인식하게 코드를 짜줬다. 언어는 파이썬인데 코드 스타일은 참... 파이썬스럽지 못하다. 자바돌이 스타일 어디 안간다...

import sys
from collections import deque

input = sys.stdin.readline
n = int(input())


def get_input():
    params = []

    for _ in range(n):
        params.append(input().strip())

    return params


def get_color(color, is_weakness):
    if is_weakness and color == "G":
        return "R"
    return color


def check_range(r, c):
    if 0 <= r < n and 0 <= c < n:
        return True
    return False


def bfs(q, grid, visited, is_weakness):
    dr = [1, -1, 0, 0]
    dc = [0, 0, 1, -1]

    while q:
        row, col, color = q.popleft()

        for i in range(4):
            nr = row + dr[i]
            nc = col + dc[i]

            if (
                check_range(nr, nc)
                and get_color(grid[nr][nc], is_weakness)
                == get_color(color, is_weakness)
                and visited[nr][nc]
            ):
                visited[nr][nc] = False
                q.append([nr, nc, color])


def check_grid(grid, is_weakness):
    q = deque()

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

    for i in range(n):
        for j in range(n):
            if visited[i][j]:
                visited[i][j] = False
                q.append([i, j, grid[i][j]])
                bfs(q, grid, visited, is_weakness)
                cnt += 1

    return cnt


def solution(grid):
    answer = []

    # 정상 시력 cnt
    answer.append(check_grid(grid, False))
    # 색약 cnt
    answer.append(check_grid(grid, True))

    return answer


if __name__ == "__main__":
    print(*solution(get_input()))
profile
뇌세포에 CPR중

0개의 댓글