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

[Python Gold V 10026] 적록색약

by Hexs 2023. 9. 14.
반응형

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

 

10026번: 적록색약

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

www.acmicpc.net

 

시간 제한 메모리 제한
1초 128MB

 

문제

  • 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.
  • 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)
  • 예를 들어, 그림이 아래와 같은 경우에
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

 

  • 적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)
  • 그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.

 

입력

  • 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
  • 둘째 줄부터 N개 줄에는 그림이 주어진다.

 

출력

  • 적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.

 

알고리즘 분류

  • 그래프 이론
  • 그래프 탐색
  • 너비 우선 탐색
  • 깊이 우선 탐색

 


 📖 Code

N = int(input())
check = False
check2 = False
check_x, check_y = [],[]
a,b = 0,0
lst = [[0 for j in range(N)] for i in range(N)]
for i in range(N):
    rgb = input()
    for j in range(N):
        if check == False:
            check_x.append(i)
            check_y.append(j)
            check = True
        lst[i][j] = rgb[j]
R, G, B, RG= 0,0,0,0
dx = [1,-1,0,0]
dy = [0,0,1,-1]



def search(color):
    global R,G,B,RG
    search_check = False
    while check_x:
        x = check_x.pop()
        y = check_y.pop()
        if color == "R" or color == "G":
            lst[x][y] = "RG"
            search_check =True
        else:
            lst[x][y] = "C"
            search_check =True
        for i in range(4):
            if N-1 >=x+dx[i]>=0 and N-1 >= y+dy[i] >= 0:                
                if lst[x+dx[i]][y+dy[i]] == color:
                    check_x.append(x+dx[i])
                    check_y.append(y+dy[i])
                    if color == "R" or color == "G":
                        lst[x+dx[i]][y+dy[i]] = "RG"
                        search_check =True
                    else :
                        lst[x+dx[i]][y+dy[i]] = "C"
                        search_check =True
    if search_check ==True:
        if color == "R":
            R+=1
        elif color == "B":
            B+=1
        elif color == "G":
            G+=1
        elif color == "RG":
            RG+=1
    for i in range(N):
        if lst[i].count("C") != N:
            for j in range(N):
                if "R" == lst[i][j] or "B" == lst[i][j] or "G" == lst[i][j]:
                    check_x.append(i)
                    check_y.append(j)
                    return search(lst[i][j])
                elif "RG" == lst[i][j] and check2 ==True:
                    check_x.append(i)
                    check_y.append(j)
                    return search(lst[i][j])
                


search(lst[check_x.pop()][check_y.pop()])
check2 = True
search("RG")

print(R+G+B, end=" ")
print(RG+B)

 ✅ Comment

총 두번 탐색을 진행한다.

첫번째 탐색은.

R , G , B 각각의 값을 알아내고.

R , G 의 경우 RG 로 바꿔준다.

B 일경우 탐색 완료 표시를 위해 C로 바꿔준다.

 

두번째 탐색으로 RG 값만 다시 탐색해주면

밑의 두값을 구할수있다.

R + B + G / RG + B

 

 

 

 

반응형

'알고리즘 > Solved_Gold' 카테고리의 다른 글

[Python Gold V 1916] 최소비용 구하기  (2) 2023.10.10
[Python Gold V 16928] 뱀과 사다리 게임  (0) 2023.09.14
[Python GOLD V 5430] AC  (0) 2023.09.01
[Python Gold V 7576]  (0) 2023.03.16