본문 바로가기
I can do it on my own!/백준

[백준] 2563번 파이썬(Python) feat.2차원 배열 선언

by zivvon 2023. 5. 31.
목차 접기

문제

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

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.


'문제 해결 아이디어'

(전체 넓이) - (빈 공간)으로 결과값을 도출해내고 싶었으나 컴퓨터에게 어떻게 빈 공간을 인지 시켜야 할지 몰라 아이디어 떠올리기부터 실패했다. 다른 코드들을 열심히 둘러보니 어차피 1 x 1 격자 형태에 색종이가 채워지기 때문에, 색종이가 채워지는 부분을 '1'로 설정해 전체 넓이에서 1의 개수를 세면 넓이를 구할 수 있다.

 

'정답 코드'

import sys

paper = [[0]*101 for i in range(101)]

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

for _ in range(n):
    x, y = map(int, sys.stdin.readline().split())

    for i in range(10):
        for j in range(10):
            paper[x+i][y+j] = 1

result = 0

for i in paper:
    for item in i:
        if item == 1:
            result += 1
    # result += sum(i)

print(result)

 

'공부한 것'

- 2차원 배열 선언

(1) 이중 for문으로 이중 리스트 선언

array = [[0 for col in range(5)] for row in range(4)]
# print(array)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

 

(2) 연산자와 for문으로 이중 리스트 선언

array = [[0]*5 for i in range(4)]
# print(array)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

 

⚠️ 연산자 *로 이중 리스트 선언?

대개 1차원 리스트는 예를 들어 array = [0] * 10으로 선언해도 전혀 문제가 없다.

그렇지만 2차원 리스트를 연산자 '*'로만 선언하게 되면 문제가 발생한다.

array = [[0]*5]*4
# print(array)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

출력형태가 (1), (2)번 형태와 같아 문제가 없다고 생각할 수 있다.

하지만!

array = [[0]*5]*4
array[0][0] = 10
# print(array)
[[10, 0, 0, 0, 0], [10, 0, 0, 0, 0], [10, 0, 0, 0, 0], [10, 0, 0, 0, 0]]

array 리스트의 0행 0열의 값을 10으로 변경했는데 모든 행의 0열의 값이 10으로 바뀐 것을 볼 수 있다.

 

이는, 파이썬에서는 '*' 연산자로 배열을 선언하게 되면 얕은 복사(shallow copy)가 일어나기 때문이다. 즉, 배열 내의 요소들이 같은 객체를 가리키게 되어 한 요소를 변경해도 다른 요소들의 값이 같이 바뀐다.

 

- sum() : iterable(리스트, 튜플 등)한 매개변수의 합을 구해주는 함수

~> sum(1, 2)처럼 동작하지 않고 sum(object)로 동작, 이때 object는 숫자(int, float)로만 구성되어 있어야 함