2563번 문제는 2차원 배열 문제입니다.
단순히 배열을 처리하는 문제라 풀이 과정 자체는 안 어려운데요.
import sys
paper = [[0]*100]*100
input = sys.stdin.readline
for _ in range(int(input().rstrip())):
a, b = map(int, input().split())
for _ in range(a, a+10):
for __ in range(90-b, 100-b):
paper[_][__] = 1
area = 0
for _ in range(100):
for __ in range(100):
if paper[_][__] == 1:
area += 1
print(area)
예제 입력 1을 넣어봤는데, 계속 지나치게 큰 output이 나오더라고요.
그래서 코드를 다시 쭉 복기했더니 paper = [[0]*100]*100 부분을 shallow copy로 생성했더라고요.
즉, [[0]*100]*100이 모두 [[0]*100]을 참조하게 되어 해당 리스트의 값이 하나라도 밖이면 전부 같이 바뀌게 됩니다.
예를 들어,
paper = [[0]*5]*5
paper[0][0] = 1
print(paper)
를 쓰게 되면
[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]로 모든 행의 첫 번째 열이 1로 변하게 됩니다.
따라서, 이를 방지하기 위해선 처음 리스트를 생성할 때 리스트 컴프리헨션을 사용해야 합니다.
paper = []
for _ in range(100):
paper.append([0]*100)
#########################################
paper = [[0]*100 for _ in range(100)]
이러면 각 내부 리스트가 독립적인 객체로 생성되기 때문에 얕은 복사 문제를 피할 수 있습니다.
여기에 맞게 코드를 수정하면 다음과 같습니다.
import sys
paper = [[0]*100 for _ in range(100)]
input = sys.stdin.readline
for _ in range(int(input().rstrip())):
a, b = map(int, input().split())
for _ in range(a, a+10):
for __ in range(90-b, 100-b):
paper[_][__] = 1
area = 0
for _ in range(100):
for __ in range(100):
if paper[_][__] == 1:
area += 1
print(area)
결과는
입니다.
오늘의 교훈
리스트를 복사하거나 생성할 땐 shallow copy와 deep copy를 잘 구분하자.
---------------------------------------------------------------------------------------------------------------------------------------------------------------
+a
컴프리헨션(comprehension)이라고 인터넷에 검색하면 이해력이라는 뜻이 나오는데요. 리스트 컴프리헨션(list comprehension)을 단순히 리스트 이해력이라는 생각 하면 좀 이상합니다. 또 리스트 표현식이라는 표현도 쓰긴 하는데 expression이랑은 단어가 달라서 의미가 미묘하게 다른 것 같습니다. 그래서 어원사전에서 comprehension을 찾아봤는데요.
내용을 정리해 보면 통합하다는 뜻이 가장 가까워 보이고요. 여기에 맞게 해석하면 여러 줄로 정의되는 반복문을 한 줄로 통합한다라는 뜻인 것 같습니다. 리스트 반복통합식(?)이라고 해야 되나, 정확히 한글식 표현으론 뭘 써야 될지는 모르겠네요. 혹시 괜찮은 표현 있으면 댓글 부탁드립니다.
참고 사이트
comprehension 어원 사전 사이트
python list comprehension 설명 사이트
'백준 > 오답노트' 카테고리의 다른 글
[백준 오답노트] 1152번 split(' ')과 split()의 차이 (0) | 2024.11.05 |
---|