문제 링크
문제 요약
H
행W
열의 격자가 주어지며, 초기 모든 칸의 색은 0입니다.Q
개의 쿼리가 주어지는데, 두 가지 종류가 있습니다.
x, y, c
가 주어지면,(x, y)
를 좌상단으로 하는 2x2 정사각형 ((x,y)
,(x+1,y)
,(x,y+1)
,(x+1,y+1)
) 내의 칸들을 색c
로 칠합니다. 단, 해당 칸이 마스킹 테이프로 덮여있지 않은 경우에만 색이 변경됩니다.x, y
가 주어지면,(x, y)
를 좌상단으로 하는 2x2 정사각형 내의 칸들을 마스킹 테이프로 덮습니다. 마스킹 테이프로 덮인 칸은 이후에 Type 1 쿼리에 의해 색이 변경되지 않습니다.
모든 쿼리 수행 후, 최종 격자의 상태를 출력하는 문제입니다. 마스킹 테이프는 단순히 색칠을 방해하는 역할을 하며, 제거 시 이전 색으로 되돌리는 등의 추가 효과는 없습니다.
풀이
문제에서 요구하는 대로 격자의 각 칸의 색상 상태와 마스킹 테이프의 덮임 상태를 실시간으로 관리하면 됩니다.
이를 위해 두 개의 H x W
크기의 2차원 배열을 사용합니다:
cells
: 각 칸의 현재 색상을 저장하는 배열. 초기값은 모두 0으로 설정합니다.masking
: 각 칸이 마스킹 테이프로 덮여있는지 여부를 저장하는 불리언 배열. 초기값은 모두False
로 설정합니다.
Q
개의 쿼리를 순서대로 처리합니다.
- Type 1 쿼리 (색칠):
x, y, c
가 주어지면,(x, y)
를 좌상단으로 하는 2x2 정사각형 (즉,(x,y)
,(x+1,y)
,(x,y+1)
,(x+1,y+1)
)에 해당하는 4개의 칸을 순회합니다. 이때 문제의 좌표는 1-indexed이므로, 배열 접근 시에는x-1
,y-1
을 사용해야 합니다.- 각 칸
(i, j)
에 대해masking[i-1][j-1]
이False
(마스킹 테이프가 없음)인 경우에만cells[i-1][j-1]
의 값을c
로 업데이트합니다.
- 각 칸
- Type 2 쿼리 (마스킹):
x, y
가 주어지면, 동일하게(x, y)
를 좌상단으로 하는 2x2 정사각형에 해당하는 4개의 칸을 순회합니다. 각 칸(i, j)
에 대해masking[i-1][j-1]
의 값을True
로 설정합니다.
모든 쿼리 처리가 완료된 후, cells
배열에 저장된 최종 색상 상태를 출력합니다.
정답 코드
def solve():
H, W, Q = map(int, input().split())
cells = [[0] * W for _ in range(H)]
masking = [[False] * W for _ in range(H)]
for _ in range(Q):
query = map(int, input().split())
if query[0] == 1:
# 색깔을 칠하는 쿼리
for i in range(query[1] - 1, query[1] + 1):
for j in range(query[2] - 1, query[2] + 1):
if not masking[i][j]:
cells[i][j] = query[3]
else:
# 마스킹하는 쿼리
for i in range(query[1] - 1, query[1] + 1):
for j in range(query[2] - 1, query[2] + 1):
masking[i][j] = True
# 모든 색상 출력
for i in range(H):
print(*cells[i])
if __name__ == "__main__":
tc = 1
for t in range(1, tc+1):
ret = solve()