반응형
문제
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.
크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)
예를 들어, 그림이 아래와 같은 경우에
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR
적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)
그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
둘째 줄부터 N개 줄에는 그림이 주어진다.
출력
적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.
전체코드(Python)
def find_team(matrix,check,iy,ix,penalty):
box = []
# 순회 할 4방위의 좌표를 임시 저장
dx = [1,-1,0,0]
dy = [0,0,1,-1]
# 순회 할 색상을 color에 저장한다.
color = matrix[iy][ix]
# 처음 들어온 위치는 1로 표시한다.
check[iy][ix] = 1
box.append([iy,ix])
# 순회할 좌표가 다 떨이지기 전까지 동일한 영역을 찾는다.
while len(box)!=0:
# 순회할 좌표 하나를 꺼낸다
point = box.pop(0)
# 순회할 좌표의 4방위를 살핀다.
for loop in range(4):
ty = point[0]+dy[loop]
tx = point[1]+dx[loop]
# 만일 순회할 좌표의 4방위 중 하나가 아직 확인하지 않은 구역이라면 확인한다.
if ty>=0 and ty<len(matrix) and tx>=0 and tx<len(matrix) and check[ty][tx]!=1:
# 적록색약인 사람은 색상이 B일대와 아닐때를 구분한다.
if penalty :
if color!='B' and matrix[ty][tx] != 'B':
box.append([ty,tx])
check[ty][tx]=1
elif color =='B' and matrix[ty][tx] == 'B':
box.append([ty,tx])
check[ty][tx]=1
else:
# 적록색약이 아닌 사람은 처음 확인한 색과 확인하는 색이 같은지 구분하여 같을때만 box에 넣는다.
if matrix[ty][tx]==color:
box.append([ty,tx])
check[ty][tx]=1
# 순회가 끝나면 1을 반환한다.
return 1
# 정상과 적록색약인 사람이 새는 갯수를 n과 s로 선언한다.
n = 0
s = 0
# 맵에 들어갈 공간을 선언
matrix = []
# 맵의 크기를 입력 받는다.
l = int(input())
# 정상과 적록색약인 사람이 확인한 영역을 표시할 맵을 생성한다.
normal = [ [0]*l for _ in range(l)]
strange = [ [0]*l for _ in range(l)]
# 맵의 크기만큼 RGB값을 입력 받는다.
for i in range(l):
matrix.append(list(input()))
# 전체 맵을 순회하면서 정상인 사람과 적록색약인 사람이 구분한 영역을 구한다.
for y in range(l):
for x in range(l):
if normal[y][x] != 1:
n+=find_team(matrix,normal,y,x,False)
if strange[y][x] != 1:
s+=find_team(matrix,strange,y,x,True)
print(n,s)
혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.
오늘도 Jindory 블로그에 방문해주셔서 감사합니다.
[ 참조 ]
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 1748번 : 수 이어 쓰기1 (0) | 2022.03.18 |
---|---|
[백준] 11725번 : 트리의 부모 찾기(Python) (0) | 2022.03.17 |
[백준] 1541번 : 잃어버린 괄호(Python) (0) | 2022.03.17 |
[백준] 1725번 : 히스토그램 (0) | 2022.03.15 |
[백준] 2669번 : 직사각형 네개의 합집합의 면적 구하기(Python) (0) | 2022.03.14 |