문제 링크

문제 요약

그린델왈드의 사진은 n x m 크기의 픽셀 테이블 p로 주어집니다. 각 픽셀은 R(빨강), G(초록), B(파랑) 또는 .(미채색) 중 하나의 색상을 가집니다.

이 사진을 n x m 크기의 전자 전광판에 표시해야 하는데, 전광판의 각 픽셀에는 0부터 7까지의 제한 c가 부여되어 있습니다. 이 제한은 Bitmask (비트마스크) 형태로, 어떤 색상을 칠할 수 있는지 나타냅니다. 예를 들어, c=1은 빨강색만 가능, c=2는 초록색만 가능, c=4는 파랑색만 가능하며, 이들의 조합으로 다른 값이 주어집니다 (예: c=3은 빨강 또는 초록 가능). 특이점은 c=0일 경우 해당 픽셀은 반드시 미채색이어야 하며, c=1부터 7까지는 해당 비트가 허용하는 색상 외에 .(미채색)도 항상 허용됩니다.

주어진 사진을 전광판의 모든 제한을 만족시키면서 표시할 수 있는지 여부를 판별하여, 가능하다면 “correct”, 불가능하다면 “incorrect”를 출력해야 합니다.

풀이

이 문제는 주어진 사진의 각 픽셀 색상이 전광판의 해당 픽셀에 부여된 제한을 만족하는지 하나씩 확인하면 됩니다. 모든 픽셀이 제한을 만족하면 “correct”, 하나라도 만족하지 않으면 즉시 “incorrect”를 출력하고 종료합니다.

전광판의 제한 c_i,j 값은 비트마스크로 해석됩니다.

  • R (빨강)은 비트 0 (값 1)에 해당합니다.
  • G (초록)은 비트 1 (값 2)에 해당합니다.
  • B (파랑)은 비트 2 (값 4)에 해당합니다.

따라서, 주어진 c 값에서 특정 색상이 허용되는지 확인하려면 비트 AND 연산을 사용합니다.

  • R이 허용되는지: (c & 1) != 0
  • G가 허용되는지: (c & 2) != 0
  • B가 허용되는지: (c & 4) != 0

문제에서 명시된 룰에 따라 각 픽셀 (i, j)에 대해 다음과 같이 검사합니다:

  1. 전광판 제한 c_i,j가 0인 경우: 이 픽셀은 작동하지 않으므로 오직 미채색(.)으로만 남겨둘 수 있습니다. 따라서, 사진의 p_i,j.이 아니라면 유효하지 않습니다.
  2. 전광판 제한 c_i,j가 1부터 7인 경우: 이 경우 해당 c 값에 따라 허용되는 색상(R, G, B)이 있으며, 추가적으로 미채색(.)도 항상 허용됩니다. 따라서, 사진의 p_i,j가 미채색(.)이라면 항상 유효합니다. p_i,jR, G, B 중 하나라면, 해당 색상이 c_i,j의 비트마스크에 의해 허용되는지 확인합니다.

정답 코드

def is_available(color: str, permission: str) -> bool:
  permission = int(permission)
 
  if permission == 0:
    return color == "."
 
  avaiable_set = ["."]
 
  if permission & 1:
    avaiable_set.append("R")
  if permission & 2:
    avaiable_set.append("G")
  if permission & 4:
    avaiable_set.append("B")
 
  return color in avaiable_set
 
def solve():
  n, m = map(int, input().split())
  colors = [input() for _ in range(n)]
  permissions = [input() for _ in range(n)]
 
  for i in range(n):
    for j in range(m):
      if is_available(colors[i][j], permissions[i][j]):
        continue
      print("incorrect")
      return
  print("correct")
 
 
if __name__ == "__main__":
  tc = 1
  for t in range(1, tc+1):
    ret = solve()
 

연관 페이지

참고 문헌 / 사이트