import sys
input = sys.stdin.readline
# n: 리스트 크기, m: 질의 수
# A: 원본 리스트, D: 합 배열
n,m = map(int, input().split())
# 0으로 구성된 n+1만큼의 길이의 배열 선언
# [[0] * n] * n 으로 리스트를 초기화할 경우, n개의 [0] * n은 모두 같은 객체로 인식
# 다차원 리스트를 선언할 때,
# [[0 for j in range(n)] for i in range(n)]
# [[0] * n for i in range(n)] 로 선언하기
A = [[0]*(n+1)]
D = [[0]*(n+1) for _ in range(n+1)]
"""
리스트 내포함수를 이용하여 리스트 내부에서 인풋을 모두 받아버린다.
- input()을 받고 공백을 기준으로 split하여 ["1 2 3 4"] -> ["1", "2", "3", "4"]
- 나온 x를 int(x) 로 변환해준다. [1,2,3,4]
- 이때 각 리스트에 값 순서대로 a, b, c, d에 들어가게 된다. [a = 1, b = 2, c = 3, d = 4]
"""
for i in range(n):
A_row = [0] + [int(x) for x in input().split()]
A.append(A_row)
for i in range(1, n+1):
for j in range(1, n+1):
# 합 배열 구하기
D[i][j] = D[i][j-1]+D[i-1][j]-D[i-1][j-1]+A[i][j]
for _ in range(m):
x1, y1, x2, y2 = map(int, input().split())
# 구간 합 배열로 질의에 답변
result = D[x2][y2] - D[x1-1][y2] - D[x2][y1-1] + D[x1-1][y1-1]
print(result)
https://velog.io/@ayoung0073/python-list
코드만 봤을 땐 이해 안 가다가 요 링크 보고 이해 완료!
특히 다차원 배열 선언 부분 주의하기
https://mingrammer.com/underscore-in-python/
파이썬에서 언더스코어(_)는 다음과 같은 상황에서 사용되는데 크게 5가지의 경우가 있다.
이 코드에선
# 인덱스 무시
for _ in range(10):
do_something()
인덱스 값을 무시한 경우로 알 수 있다.
책의 풀이를 보았을 때, 배열의 index가 1부터 시작하는 것을 보아
배열의 크기를 n+1로 잡고 array[0]=0
로 초기화함으로써 index 값을 1부터 사용하는 것.
for i in range(n):
A_row = [0] + [int(x) for x in input().split()]
A.append(A_row)
https://dojang.io/mod/page/view.php?id=2291
이해가 안 가서 리스트에 내가 값 다 넣겠음
n=4
A = [[0]*(n+1)]
print(A)
for i in range(n):
A_row = [0] + [i+1,i+2,i+3,i+4]
A.append(A_row)
print(A)
print("\n")
[[0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4]]
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 3, 4, 5]]
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 3, 4, 5], [0, 3, 4, 5, 6]]
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 3, 4, 5], [0, 3, 4, 5, 6], [0, 4, 5, 6, 7]]
아...
찍어보니 알겠네
일단 A[0]행을 만들어준거고
그 다음에 리스트 형식으로 붙여서 A[1], A[2] 이렇게 가는구나.....
아오 왤케 이걸 이해를 못해서~~~
암튼 index 0부분 안 쓰려고 다 0넣은 것을 확인할 수 있다.
range(stop)
range(4)
는 0,1,2,3 숫자 생성.
마지막 숫자는 포함 X