문제 링크

문제 요약

  • HW열의 격자가 주어지며, 초기 모든 칸의 색은 0입니다. Q개의 쿼리가 주어지는데, 두 가지 종류가 있습니다.
  1. x, y, c가 주어지면, (x, y)를 좌상단으로 하는 2x2 정사각형 ((x,y), (x+1,y), (x,y+1), (x+1,y+1)) 내의 칸들을 색 c로 칠합니다. 단, 해당 칸이 마스킹 테이프로 덮여있지 않은 경우에만 색이 변경됩니다.
  2. x, y가 주어지면, (x, y)를 좌상단으로 하는 2x2 정사각형 내의 칸들을 마스킹 테이프로 덮습니다. 마스킹 테이프로 덮인 칸은 이후에 Type 1 쿼리에 의해 색이 변경되지 않습니다.

모든 쿼리 수행 후, 최종 격자의 상태를 출력하는 문제입니다. 마스킹 테이프는 단순히 색칠을 방해하는 역할을 하며, 제거 시 이전 색으로 되돌리는 등의 추가 효과는 없습니다.

풀이

문제에서 요구하는 대로 격자의 각 칸의 색상 상태와 마스킹 테이프의 덮임 상태를 실시간으로 관리하면 됩니다. 이를 위해 두 개의 H x W 크기의 2차원 배열을 사용합니다:

  1. cells: 각 칸의 현재 색상을 저장하는 배열. 초기값은 모두 0으로 설정합니다.
  2. 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()
 

연관 페이지

참고 문헌 / 사이트