본문 바로가기
알고리즘/BOJ

[BOJ] 10026번 적록색약 / 사용언어 : 파이썬(python)

by 바른 호랑이 2022. 1. 15.
728x90
반응형

※ 문제링크 

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

해당문제는 BFS로 해결할 수 있는 문제였다. 구현할 때 정상인 사람의 경우에는 입력좌표값과 상, 하, 좌, 우 좌표값의 색이 완전히 일치할때만 연결해주고, 적록색약의 경우 R, G의 경우는 통합시켜서 연결해주면 쉽게 해결할 수 있는 문제였다. 자세한 풀이방법과 코드는 아래와 같다.

1. 입력값을 2차원 배열의 형태로 변환시켜준다.

2. 정상인 사람과 적록색약인 사람을 나누어서 각각 탐색할 BFS함수를 작성해준다.

3. 결과값을 출력해준다.

+ 시간 및 메모리 단축을 위해 sys함수를 사용하였으며, 사용시에는 개행문자에 유의해서 사용하도록 하자.

 

import sys
from collections import deque

N = int(input())
field = []
for _ in range(N):
    color_list = input()
    sample = []
    for color in color_list:
        sample.append(color)
    field.append(sample)

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

def bfs1(): # 정상인
    queue = deque()
    visited = [[False for _ in range(N)] for _ in range(N)]
    cnt = 0
    for x in range(N):
        for y in range(N):
            if visited[y][x] == False:
                visited[y][x] = True
                queue.append([x, y])
                while queue:
                    sx, sy = queue.popleft()
                    for i in range(4):
                        nx = sx + dx[i]
                        ny = sy + dy[i]
                        if 0 <= nx < N and 0 <= ny < N and visited[ny][nx] == False and field[y][x] == field[ny][nx]:
                            visited[ny][nx] = True
                            queue.append([nx, ny])
                cnt += 1
    return cnt

def bfs2(): # 적록색약
    queue = deque()
    visited = [[False for _ in range(N)] for _ in range(N)]
    cnt = 0
    for x in range(N):
        for y in range(N):
            if visited[y][x] == False:
                visited[y][x] = True
                queue.append([x, y])
                while queue:
                    sx, sy = queue.popleft()
                    for i in range(4):
                        nx = sx + dx[i]
                        ny = sy + dy[i]
                        if 0 <= nx < N and 0 <= ny < N and visited[ny][nx] == False:
                            if field[y][x] == 'R' or field[y][x] == 'G':
                                if field[ny][nx] == 'R' or field[ny][nx] == 'G': 
                                    visited[ny][nx] = True
                                    queue.append([nx, ny])
                            else:
                                if field[y][x] == field[ny][nx]:
                                    visited[ny][nx] = True
                                    queue.append([nx, ny])
                cnt += 1
    return cnt

print(bfs1(), bfs2())

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글