본문 바로가기
Problem Solving/백준

[백준|파이썬] 2563: 색종이 (실버5)

by 청량리 물냉면 2023. 4. 19.
반응형
문제

https://www.acmicpc.net/problem/2563

 

2563번: 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록

www.acmicpc.net

 

 

🐍파이썬
더보기

❌ 실패한 코드

import sys
paper = int(sys.stdin.readline())
dic = {}
for i in range(paper):
    a, b = map(int, sys.stdin.readline().split())
    dic[i] = [(a, a+10), (b, b+10)]
sum = 0
for i in range(paper):
    for j in range(i+1, paper):
        #겹치는 부분 찾기(x축)
        x = min(dic[i][0][1],dic[j][0][1]) - max(dic[i][0][0],dic[j][0][0])
        if x > 0:
            #겹치는 부분 찾기(y축)
            y = min(dic[i][1][1],dic[j][1][1]) - max(dic[i][1][0],dic[j][1][0])
            if y > 0:
                sum += x*y
print(paper*100 - sum)

겹치는 부분의 x, y길이를 이용해 넓이를 구한 뒤 전체 넓이에서 빼주려고 시도했다.

주어진 테스트케이스는 통과했는데 히든 테스트케이스를 통과하지는 못했다.

import sys
paper = int(sys.stdin.readline())
arr = [[0]*101 for _ in range(101)]
cnt = 0
for i in range(paper):
    a, b = map(int, sys.stdin.readline().split())
    for i in range(b, b+10):
        for j in range(a, a+10):
            arr[i][j] = 1
for i in range(101):
    cnt += arr[i].count(1)
print(cnt)

가로 세로 길이가 100인 도화지를 0으로 채운 이차원배열로 표현했다.

가로세로 길이가 10인 검은색 종이가 차지하는 부분을 1로 채웠다.

이러한 방법을 사용하면 이미 1인 부분은 또다시 카운팅 되지 않으므로 최종적으로 배열에 몇 개의 1이 있는지 세어주기만 하면 된다.

반응형