문제
가로, 세로의 크기가 각각 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)로만 구성되어 있어야 함
'I can do it on my own! > 백준' 카테고리의 다른 글
[백준] 10773번 파이썬(Python) (0) | 2023.06.01 |
---|---|
[백준] 10828번 파이썬(Python) feat.스택 (0) | 2023.06.01 |
[백준] 10798번 파이썬(Python) (0) | 2023.05.31 |
[백준] 2566번 파이썬(Python) (0) | 2023.05.31 |
[백준] 2738번 파이썬(Python) (0) | 2023.05.31 |