[11660]구간합구하기2.py

heyryu·2023년 5월 16일
0
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)

파이썬 Array와 list

https://velog.io/@ayoung0073/python-list
코드만 봤을 땐 이해 안 가다가 요 링크 보고 이해 완료!
특히 다차원 배열 선언 부분 주의하기

for _ in range()

https://mingrammer.com/underscore-in-python/
파이썬에서 언더스코어(_)는 다음과 같은 상황에서 사용되는데 크게 5가지의 경우가 있다.

  • 인터프리터(Interpreter)에서 마지막 값을 저장할 때
  • 값을 무시하고 싶을 때 (흔히 “I don’t care"라고 부른다.)
  • 변수나 함수명에 특별한 의미 또는 기능을 부여하고자 할 때
  • 국제화(Internationalization, i18n)/지역화(Localization, l10n) 함수로써 사용할 때
  • 숫자 리터럴값의 자릿수 구분을 위한 구분자로써 사용할 때

이 코드에선

# 인덱스 무시
for _ in range(10):
    do_something()

인덱스 값을 무시한 경우로 알 수 있다.

index 값

책의 풀이를 보았을 때, 배열의 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() 함수

range(stop)
range(4)는 0,1,2,3 숫자 생성.
마지막 숫자는 포함 X

profile
못하면 열심히 하는 게 당연하니까💪 [Frontend/서비스기획]

0개의 댓글