[백준 10026번 문제, Python 3] 적록색약

2023. 12. 31. 00:05·정리 전 게시글/공부 관련

문제

 

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.

크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)

예를 들어, 그림이 아래와 같은 경우에

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)

그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.


코드

import sys
from collections import deque

sys.setrecursionlimit(10 ** 6)


def check_eq_rgb(stack, selected, picture, i, u):
    # 현재 색상과 동일한 상, 하, 좌, 우 색상을 비교
    if i - 1 >= 0 and picture[i - 1][u] == picture[i][u]:  # 상단 색상 비교
        add_stack(selected, stack, (i - 1, u))

    if u - 1 >= 0 and picture[i][u - 1] == picture[i][u]:  # 좌측 색상 비교
        add_stack(selected, stack, (i, u - 1))

    if u + 1 < len(picture[i]) and picture[i][u + 1] == picture[i][u]:  # 우측 색상 비교
        add_stack(selected, stack, (i, u + 1))

    if i + 1 < len(picture) and picture[i + 1][u] == picture[i][u]:  # 하단 색상 비교
        add_stack(selected, stack, (i + 1, u))

    while stack:
        coord = stack.pop()
        if coord not in selected:
            selected.add(coord)
            check_eq_rgb(stack, selected, picture, coord[0], coord[1])


def add_stack(selected, stack, coord):
    if coord not in selected:
        stack.append(coord)


def main():
    cnt = int(sys.stdin.readline())
    picture_normal = [sys.stdin.readline().strip() for _ in range(cnt)]
    picture_cblind = [list(line) for line in picture_normal]

    for i in range(len(picture_cblind)):
        for u in range(len(picture_cblind[i])):
            if picture_cblind[i][u] == "G":
                picture_cblind[i][u] = "R"

    selected_normal = set()
    selected_cblind = set()

    r, g, b = 0, 0, 0

    for i, line in enumerate(picture_normal):
        stack_normal = deque()  # 임시 저장할 스택

        for u, c in enumerate(line):
            if not (i, u) in selected_normal:  # 방문한 좌표가 아닌 경우
                # 현재 색깔 단위 카운트 추가
                if c == "R":
                    r += 1
                elif c == "G":
                    g += 1
                elif c == "B":
                    b += 1

                selected_normal.add((i, u))  # 셋에 방문했다고 추가
                check_eq_rgb(stack_normal, selected_normal, picture_normal, i, u)  # 상, 하, 좌, 우 색상 체크

    # print(r, g, b, "답: ", r + g + b)
    normal = r + g + b

    r, b = 0, 0

    for i, line in enumerate(picture_cblind):
        stack_cblind = deque()  # 임시 저장할 스택

        for u, c in enumerate(line):
            if not (i, u) in selected_cblind:  # 방문한 좌표가 아닌 경우
                # 현재 색깔 단위 카운트 추가
                if c == "R":
                    r += 1
                elif c == "B":
                    b += 1

                selected_cblind.add((i, u))  # 셋에 방문했다고 추가
                check_eq_rgb(stack_cblind, selected_cblind, picture_cblind, i, u)  # 상, 하, 좌, 우 색상 체크

    # print(r, b, "답: ", r + b)
    cblind = r + b

    print(normal, cblind)


if __name__ == '__main__':
    main()

해결

 

RGB 배열이 들어왔을 때 일반인과 적록색약이 봤을 때 색깔의 뭉텅이 개수를 구하는 문제이다

 

일반인과 색약의 기준에서 한번에 구하는 방법은 생각하지 못했다

그래서 각각 따로 보는 그림을 만들어서 답을 구했다

그러나 이렇게 구하면 각각 따로 반복문을 돌기 때문에 약간 노가다 느낌이 있다


참고

링크

 

 

 

저작자표시 (새창열림)

'정리 전 게시글 > 공부 관련' 카테고리의 다른 글

[프로그래머스 Lv 1, Python 3] 개인정보 수집 유효기간  (1) 2023.12.30
일본 규슈 공업 대학교 연구실 해외 연수 2주일차 후기  (3) 2023.08.02
일본 규슈 공업 대학교 연구실 해외 연수 1주일차 후기  (0) 2023.07.24
파이썬 슬랙 챗봇 만들기 Slack Python ChatBot 코드 최신정보  (0) 2023.07.11
티스토리에 움짤 이모티콘 올리는 방법 feat. Tenor  (0) 2023.07.11
'정리 전 게시글/공부 관련' 카테고리의 다른 글
  • [프로그래머스 Lv 1, Python 3] 개인정보 수집 유효기간
  • 일본 규슈 공업 대학교 연구실 해외 연수 2주일차 후기
  • 일본 규슈 공업 대학교 연구실 해외 연수 1주일차 후기
  • 파이썬 슬랙 챗봇 만들기 Slack Python ChatBot 코드 최신정보
aptenia
aptenia
공부하면서 배운 것들
  • aptenia
    새벽의 아이디어
    aptenia
  • 전체
    오늘
    어제
    • 분류 전체보기 (277) N
      • f1tenth (2)
      • 개발 관련 아무거나 (1) N
      • 정리 전 게시글 (268)
        • 개발 관련 (25)
        • 정보 관련 (19)
        • 공부 관련 (224)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 네이버 블로그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    콜라츠추측
    공개SW개발자대회
    자바
    C언어
    안드로이드
    반복하지않는수
    컨텍스트스위칭
    마인크래프트
    이것이자바다확인문제
    파이썬
    마인크래프트스크립트
    빅데이터공모전
    c언어초보
    스크롤바CSS
    티스토리반응형2스킨편집
    C++강좌
    마크스크립트
    C언어강좌
    티스토리스킨편집
    이것이자바다
    프로그래머스PCCE
    프로그래머스
    마인크래프트강화스크립트
    티스토리HTML
    일본규슈공업대학교
    캡스톤디자인
    이것이자바다연습문제
    마크
    파이어베이스
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
aptenia
[백준 10026번 문제, Python 3] 적록색약
상단으로

티스토리툴바