통상적으로 생각 할 수 있는 구현에서 조건이 약간 달라지는 문제이다. 만들다보면 겹치는 영역이 많은 상황으로 빠지게 될 수 도 있는데, 절대 코드를 줄여보겠다고 시도하지말라.
소프트웨어 개발 모델이라는 이론적인 영역뿐만 아니라 기본적인 프로그램 개발에 있어서도 일단 작동 되는걸 만들고 시간내지 코드 줄이기를 해야겠다는 되새김을 다시 하는 문제였다. 물론 안해도 되면 안 할 것이다.
https://www.acmicpc.net/problem/10026
import sys
from collections import deque
input = sys.stdin.readline
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
areaSize = int(input())
area = []
duo_q = deque()
tri_q = deque()
duo_cnt = 0
tri_cnt = 0
duo_isVisited = [[False for _ in range(areaSize)] for _ in range(areaSize)]
tri_isVisited = [[False for _ in range(areaSize)] for _ in range(areaSize)]
for i in range(areaSize):
area.append(list((input().strip())))
for i in range(areaSize):
for j in range(areaSize):
if(tri_isVisited[i][j] == False):
tri_cnt += 1
tri_q.append([i, j, area[i][j]])
while(tri_q):
x, y, color = tri_q.popleft()
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if(0 > nx or nx >= areaSize or 0 > ny or ny >= areaSize):
continue
if(tri_isVisited[nx][ny] == True):
continue
if(area[nx][ny] != color):
continue
tri_isVisited[nx][ny] = True
tri_q.append([nx, ny, area[nx][ny]])
if(duo_isVisited[i][j] == False):
duo_cnt += 1
duo_q.append([i, j, area[i][j]])
while(duo_q):
x, y, color = duo_q.popleft()
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if(0 > nx or nx >= areaSize or 0 > ny or ny >= areaSize):
continue
if(duo_isVisited[nx][ny] == True):
continue
if(color == 'R' or color == 'G'):
if(area[nx][ny] == 'B'):
continue
else:
if(area[nx][ny] != 'B'):
continue
duo_isVisited[nx][ny] = True
duo_q.append([nx, ny, area[nx][ny]])
print(f"{tri_cnt} {duo_cnt}")
'문제풀이' 카테고리의 다른 글
BOJ 11726 : 2xn 타일링 (0) | 2025.05.17 |
---|---|
BOJ 1475 : 방 번호 (0) | 2025.05.15 |
BOJ 1012 : 유기농 배추 (0) | 2025.05.13 |
BOJ 14891 : 톱니바퀴 (0) | 2025.05.12 |
malloc LAB #3 : Explicit Free List (0) | 2025.04.28 |