CODING TEST/Beakjoon

[백준 / python / 2563] 색종이

더라 2023. 10. 22. 00:15
728x90

문제

 

 

문제 보러가기

[백준]2563 - 색종이

 

2563번: 색종이

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변

www.acmicpc.net

 

입출력

입력 1줄 색종이 개수 n
2
~
n+1줄
색종이 왼쪽면, 아랫면(문제 사진상)
출력 색종이 넓이

 

 


풀이

n = int(input())
arr = [
    [0] * 100
    for _ in range(100)
]
for _ in range(n):
    x, y = map(int, input().split())
    for i in range(y, y + 10):
        for j in range(x, x + 10):
            arr[i][j] = 1
total = 0
for i in range(100):
    total += arr[i].count(1)
print(total)

1) 색종이 개수 n을 입력 받는다.

2) 배열 100x100사이즈를 0으로 채운다.

3) n번 색종이의 옆면, 윗면 좌표를 받는다. (문제 사진상으로는 밑면이지만 배열은 아래 방향으로 값이 증가함으로 윗면)

4) 색종이의 크기는 가로, 세로 각각 10이므로 반복문은 y~y+10, x~x+10만큼 반복한다.

4.1) arr[y][x]값을 1로 대입한다. (1은 색종이가 위치한 것이다.)

5) 각 행의 1 개수를 total에 합한다.

 

 

💡 배열에서 값 0은 빈 공간, 1은 색종이가 위치한 공간을 뜻한다. 문제에서 중요한 점은 색종이가 2번 이상 중첩되는 경우가 있다. 색종이가 위치한 공간을 1로 설정하면 몇번을 중첩하더라도 횟수가 아닌 색종이의 유, 무만 계산하게된다.

 

💭 초반에는 겹치는 면이 어디인지 테스트케이스를 나눠 사각형의 넓이를 구하는 공식인 (가로x세로)를 사용해 계산했다. 중첩되는 부분이 있으면 그만큼 총 넓이에서 한번 제거했다. 그러나 이 방법은 중첩된 부분이 1번되는 경우에는 어렵지 않지만, 테스트를 하면서 2번이상 중첩시에는 계산이 복잡해진다. 따라서 방법을 아예 바꿔 중첩시 이어붙인다는 느낌으로 유, 무만을 나타냈다.

다 완성된 코드는 간단한데 돌아오는 길이 몹시 멀었다😂

수식으로 풀던과정은 결론적으로 틀렸지만 기록용으로 코드를 남긴다.

더보기
n = int(input())
arr=[]
for _ in range(n):
    x, y = map(int, input().split())
    #왼쪽, 위, 오른쪽, 아래
    arr.append([x, 100-(y+10), x+10, 100-y])
print(arr)

area = 100 * n

def area_cal(x1, x2, y1, y2, cnt):
    if x1>x2:
        tmp = x1
        x1 = x2
        x2 = tmp
    if y1>y2:
        tmp = y1
        y1 = y2
        y2 = tmp

    x = x2 - x1
    y = y2 - y1
    print(x*y)
    return x * y


for now in range(n):
    cnt = 0
    for other in range(now+1, n):
        overlap = 0
        # 왼쪽
        if arr[other][0] < arr[now][0] < arr[other][2]:
            # 위쪽
            if arr[other][1] < arr[now][1] < arr[other][3]:
                print('-1')
                overlap = area_cal(arr[now][0], arr[other][2], arr[now][1], arr[other][3])
            # 아래쪽
            elif arr[other][1] < arr[now][3] < arr[other][3]:
                print('-2')
                overlap = area_cal(arr[now][0], arr[other][2], arr[now][3], arr[other][1])
            else:
                print('-1,1')
                overlap = area_cal(arr[now][0], arr[other][2], arr[now][3], arr[now][1])
            area -= overlap
        # 오른쪽
        elif arr[other][0] < arr[now][2] < arr[other][2]:
            # 위쪽
            if arr[other][1] < arr[now][1] < arr[other][3]:
                print('-3')
                overlap = area_cal(arr[now][2], arr[other][0], arr[now][1], arr[other][3])
            # 아래쪽
            elif arr[other][1] < arr[now][3] < arr[other][3]:
                print('-4')
                overlap = area_cal(arr[now][2], arr[other][0], arr[now][3], arr[other][1])
            else:
                print('-1.2')
                print(now)
                overlap = area_cal(arr[now][2], arr[other][0], arr[now][3], arr[now][1])
            area -= overlap
        # y만 겹침
        else:
            # 위쪽
            if arr[other][1] < arr[now][1] < arr[other][3]:
                print('-1.3')
                overlap = area_cal(arr[now][2], arr[now][0], arr[now][1], arr[other][3])
            # 아래쪽
            elif arr[other][1] < arr[now][3] < arr[other][3]:
                print('-1.4')
                overlap = area_cal(arr[now][2], arr[now][0], arr[now][3], arr[other][1])
            area -= overlap
print(area)

 

 

728x90