문제 링크
문제 요약
그린델왈드의 사진은 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)
에 대해 다음과 같이 검사합니다:
- 전광판 제한
c_i,j
가 0인 경우: 이 픽셀은 작동하지 않으므로 오직 미채색(.
)으로만 남겨둘 수 있습니다. 따라서, 사진의p_i,j
가.
이 아니라면 유효하지 않습니다. - 전광판 제한
c_i,j
가 1부터 7인 경우: 이 경우 해당c
값에 따라 허용되는 색상(R, G, B)이 있으며, 추가적으로 미채색(.
)도 항상 허용됩니다. 따라서, 사진의p_i,j
가 미채색(.
)이라면 항상 유효합니다.p_i,j
가R
,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()