문제 링크
문제 요약
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()