백준/문제풀이_python

10026 적록색약 _python

휴대용치즈 2022. 12. 7. 12:47

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

 

10026번: 적록색약

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

www.acmicpc.net

색약이 있어도 사는데 지장없다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

문제 접근

문제를 보자말자 떠오른게 플러드필 2번쓰면 되겠다 싶었다.

https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9F%AC%EB%93%9C_%ED%95%84

 

플러드 필 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 4방향 재귀적 플러드 필 플러드 필(영어: flood fill) 혹은 시드 필(영어: seed fill)은 다차원 배열의 어떤 칸과 연결된 영역을 찾는 알고리즘이다. 이 알고리즘은 그

ko.wikipedia.org

색칠하는 알고리즘. 몰라도 BFS나 DFS응용이라고 생각하면 되고, 쉽게 떠올릴 수 있는 방법.

 

너무 쉽게 떠오르는데 골드라서 시간초과가 날줄알고 방문을 한번 탐색에서 방문체크를 두개 동시에 해야할 줄알았으나,

구현하면 너무 복잡하게 코드가 그려질거 같아서 그냥 코드를 만들어봤다.

의외로 빠른속도가 나왔다. ^ㅇ^

색약이 아닌 사람의 답과 색약인 사람의 답을 따로 1번씩 해주면 끝이다.

 

필자는 함수로 안만들고 그냥 복붙으로 깡구현했다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

코드

import sys
input = sys.stdin.readline

"""
플러드 필 2번
"""

N = int(input())
color = [input().rstrip() for _ in range(N)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
visited = [[False] * N for i in range(N)] 
list = []
ans = 0

for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            list.append((i,j))
            visited[i][j] = True
            curColor = color[i][j]

            while list:
                x, y = list.pop()
                for k in range(4):
                    xi = x + dx[k]
                    yi = y + dy[k]
                    if 0<=xi<N and 0<=yi<N and not visited[xi][yi] and color[xi][yi] == curColor:
                        visited[xi][yi] = True
                        list.append((xi,yi))
            ans += 1

print(ans, end=" ")
        
visited = [[False] * N for i in range(N)] 
list = []
ans = 0
for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            list.append((i,j))
            visited[i][j] = True
            curColor = color[i][j]
            if curColor == "B":
                while list:
                    x, y = list.pop()
                    for k in range(4):
                        xi = x + dx[k]
                        yi = y + dy[k]
                        if 0<=xi<N and 0<=yi<N and not visited[xi][yi] and color[xi][yi] == "B":
                            visited[xi][yi] = True
                            list.append((xi,yi))
                ans += 1
            else:
                while list:
                    x, y = list.pop()
                    for k in range(4):
                        xi = x + dx[k]
                        yi = y + dy[k]
                        if 0<=xi<N and 0<=yi<N and not visited[xi][yi] and color[xi][yi] != "B":
                            visited[xi][yi] = True
                            list.append((xi,yi))
                ans += 1

print(ans, end=" ")

68ms

python에서 2등 키야