본문 바로가기
코딩테스트

[Python] 백준 - 2563번 색종이

by 박매트 2024. 6. 12.

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

 

나의 답

import sys

N = int(sys.stdin.readline())

max_karo = 0
max_sero = 0


result = []

for i in range(N):
    N = list(map(int,sys.stdin.readline().split()))
    result.append(N)
    
    max_karo = max(max_karo,N[0])
    max_sero = max(max_sero,N[1])


arr = [[0 for j in range(max_karo+10)] for i in range(max_sero+10)]


for re in result:

    for j in range (re[1],re[1]+10):
        for i in range (re[0],re[0]+10):
            arr[j][i] = 1

cnt = 0

for i in arr:
    cnt+=sum(i)
print(cnt)

 

효율성은 굉장히 엉망일 듯 하다.

 

우선 입력받는다.

입력받은 값 중에, 가장 큰 세로 값, 가장 작은 세로 값을 추려낸다.

 

큰 세로값 X 작은 세로 값 으로 이루어진 0으로 채워진 2차원 배열을 생성한다.

이 때, 각 색종이의 면적에 해당하는 부분을 1로 채운다.

 

그 다음에, 1로 채워진 부분을 세면 되는데

어짜피 0과 1로 이루어진 것이므로 각 줄마다의 합을 구해 총 합을 구한다

 

다른 사람 답 

N = int(input())
array = [[0] * 100 for _ in range(100)]  # 도화지 범위 초기화
for _ in range(N):  # 입력 받은 도화지 개수만큼 돈다.
    y1, x1 = map(int, input().split())  # 왼쪽아래 x,y 좌표를 받는다.

    for i in range(x1, x1 + 10):  # 세로를 돈다.
        for j in range(y1, y1 + 10):  # 가로를 돈다.
            array[i][j] = 1  # 해당 범위 값을 0에서 1로 바꿔준다.

result = 0  # 넓이를 출력할 변수
for k in range(100):  # 전체 도화지를 돌면서
    result += array[k].count(1)  # 1 개수만 세어준다

print(result)

 

원리는 비슷한 듯 하다

애초에 도화지 100X100 크기의 도화지였구나..ㅎ

문제를 제대로 읽어봐야겠다...

 

알게된 점

2차원 배열 입력받는 것은 항상 헷갈린다....

arr = [[0 for j in range(max_karo+10)] for i in range(max_sero+10)]

 

[0 for _ in range (N)] => 0으로 채워진 길이가 N인 1차원 배열

 

이 배열을 M 개 만든다?

[[0 for _ in range(N)] for _ in range(M)]

 

M*N인 2차원 배열이 만들어지는 것.

 

그리고 2차원 배열에서 count랑 sum 은 안되는 군..1차원에서 되는 구나