Skip to content

[백준] 2563. 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하라.


처음에 실수 구간에서 연속형 변수의 분포 구역의 넓이를 구하는 문제로 착각했는데, 이산형 변수로 생각하니 단순 이차원 배열이므로 아래와 같이 쉽게 풀이할 수 있었다.

t = [[0 for _ in range(100)] for _ in range(100)]
a = [[int(x) for x in input().split()] for _ in range(int(input()))]

for i, j in a:
    for r in range(i, i + 10):
        for c in range(j, j + 10):
            t[r][c] = 1

print(sum(v for r in t for v in r))

아래와 같이 함수형으로 풀어내는 방법도 있는데, 다뤄야 하는 수의 크기도 커지고 bool 연산이 추가되어서인지 오히려 프로그램의 성능은 떨어진다.

def add(*a):
    return [[sum(v) for v in zip(*i)] for i in zip(*a)]


def mat(r, c):
    return [
        [1 if r <= j < r + 10 else 0 for j in range(100)] if c <= i < c + 10
        else [0] * 100 for i in range(100)
    ]


a = [[int(x) for x in input().split()] for _ in range(int(input()))]
print(sum((bool(v) for m in add(*[mat(x, y) for x, y in a]) for v in m)))

Reference