장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • 기초 지식
  • Kruskal algorithm
  • BFS
  • JavaScript
  • Visual Studio
  • CS
  • JS
  • 자료구조
  • 알고리즘
  • DFS
  • 프로그래머스
  • 씨포유
  • bitmask
  • 프로그래밍언어
  • 코딩테스트
  • C
  • 파이썬
  • 백준
  • PS
  • python3
  • nodejs
  • Network
  • DP
  • codesandbox
  • Implementation
  • Priority Queue
  • Stack
  • 자바스크립트
  • recursion
  • pypy3

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[백준(BOJ)] #10026- 적록색약 (파이썬, Python3)
PS/백준

[백준(BOJ)] #10026- 적록색약 (파이썬, Python3)

2022. 11. 15. 10:40
728x90

문제

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

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

www.acmicpc.net

 


문제 풀이

DFS 알고리즘 적용!

 

2022.07.12 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] DFS(깊이 우선 탐색)

 

[파이썬으로 배우는 알고리즘] DFS(깊이 우선 탐색)

DFS란? DFS(Depth First Search)는 그래프의 모든 노드를 탐색하는 방법 중 하나로, 깊이를 우선으로 탐색한 후 더 이상 탐색할 노드가 없다면 이전으로 돌아가 탐색을 이어나가는 탐색 알고리즘입니다.

c4u-rdav.tistory.com

 

적록색약인 사람은 빨간색과 초록색의 차이를 거의 못 느끼기 때문에 일반 사람들이 보는 그리드 A에서 초록색을 모두 빨간색으로 바꿔 구역의 수를 구해주면 됩니다.

 

1) 일반 사람들이 보는 그리드 a를 입력 받는다.
2) 그리드 a에서 초록색을 모두 빨간색으로 바꾼 그리드 b를 만든다.
3) 각각 그리드에서 방문 여부를 체크하는 visited 리스트를 생성한다.
4) DFS 알고리즘을 적용하여 구역의 수를 구한다.

 


구현

코드

import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

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

def dfs(board, visited, pos, color):
    tx, ty = pos
    board[tx][ty] = '-'
    visited[tx][ty] = True
    for k in range(4):
        x = tx + dx[k]
        y = ty + dy[k]
        if 0 <= x < N and 0 <= y < N and board[x][y] == color and not visited[x][y]:
            dfs(board, visited, (x, y), color)

if __name__ == "__main__":
    colors = ['R', 'G', 'B']
    N = int(input())
    a = list(list(map(str, input().rstrip())) for _ in range(N))
    b = [[''] * N for _ in range(N)]
    # 적록색약이 보는 그리드를 구해주는 작업
    for i in range(N):
        for j in range(N):
            if a[i][j] == 'R' or a[i][j] == 'G':
                b[i][j] = 'R'
            else:
                b[i][j] = 'B'
    visited_a = [[False] * N for _ in range(N)]
    visited_b = [[False] * N for _ in range(N)]
    res_a = 0
    res_b = 0

    for i in range(N):
        for j in range(N):
            if a[i][j] in colors:
                res_a += 1
                if a[i][j] == 'R':
                    dfs(a, visited_a, (i, j), 'R')
                elif a[i][j] == 'G':
                    dfs(a, visited_a, (i, j), 'G')
                elif a[i][j] == 'B':
                    dfs(a, visited_a, (i, j), 'B')
            if b[i][j] in colors:
                res_b += 1
                if b[i][j] == 'R':
                    dfs(b, visited_b, (i, j), 'R')
                elif b[i][j] == 'B':
                    dfs(b, visited_b, (i, j), 'B')
    print(res_a, res_b)

결과

 

728x90
반응형
저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준(BOJ)] #1520- 내리막 길 (파이썬, Python3)  (0) 2022.11.16
[백준(BOJ)] #4485- 녹색 옷 입은 애가 젤다지? (파이썬, PyPy3)  (0) 2022.11.16
[백준(BOJ)] #2014- 소수의 곱 (파이썬, PyPy3)  (0) 2022.11.12
[백준(BOJ)] #1507- 궁금한 민호 (파이썬, PyPy3)  (0) 2022.11.11
[백준(BOJ)] #1561- 놀이 공원 (파이썬, PyPy3)  (0) 2022.11.09
    'PS/백준' 카테고리의 다른 글
    • [백준(BOJ)] #1520- 내리막 길 (파이썬, Python3)
    • [백준(BOJ)] #4485- 녹색 옷 입은 애가 젤다지? (파이썬, PyPy3)
    • [백준(BOJ)] #2014- 소수의 곱 (파이썬, PyPy3)
    • [백준(BOJ)] #1507- 궁금한 민호 (파이썬, PyPy3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바