백준 2167번 : 2차원 배열의 합 문제풀이 [파이썬]
<문제>
2167번 문제의 내용은 아래와 같습니다.
2차원 배열의 합
문제
2차원 배열이 주어졌을 때 (i, j) 위치부터 (x, y) 위치까지에 저장되어 있는 수들의 합을 구하는 프로그램을 작성하시오. 배열의 (i, j) 위치는 i행 j열을 나타낸다.
입력
첫째 줄에 배열의 크기 N, M(1 ≤ N, M ≤ 300)이 주어진다. 다음 N개의 줄에는 M개의 정수로 배열이 주어진다. 배열에 포함되어 있는 수는 절댓값이 10,000보다 작거나 같은 정수이다. 그 다음 줄에는 합을 구할 부분의 개수 K(1 ≤ K ≤ 10,000)가 주어진다. 다음 K개의 줄에는 네 개의 정수로 i, j, x, y가 주어진다(1 ≤ i ≤ x ≤ N, 1 ≤ j ≤ y ≤ M).
출력
K개의 줄에 순서대로 배열의 합을 출력한다. 배열의 합은 231-1보다 작거나 같다.
예제 입력 1 복사
2 3
1 2 4
8 16 32
3
1 1 2 3
1 2 1 2
1 3 2 3
예제 출력 1 복사
63
2
36
<작성한 코드>
#2차원 배열의 합
import sys
N, M = map(int, sys.stdin.readline().split())
nums = []
prefix_sum = [[0] *(M+1) for _ in range(N+1)]
for _ in range(N):
nums.append(list(map(int, sys.stdin.readline().split())))
for i in range(1,N+1):
for j in range(1,M+1):
prefix_sum[i][j] = nums[i-1][j-1] + prefix_sum[i-1][j] + prefix_sum[i][j-1] - prefix_sum[i-1][j-1]
K = int(sys.stdin.readline())
for _ in range(K):
i, j, x, y = map(int, sys.stdin.readline().split())
print(prefix_sum[i-1][j-1] + prefix_sum[x][y] - prefix_sum[i-1][y] - prefix_sum[x][j-1])
<코드 풀이>
본 문제는 지난번 풀었던 2차원 배열 누적합과 비슷한 부분이 많다.
아래 포스팅 참고!
2023.04.15 - [백준 알고리즘] - 백준 11660번 구간 합 구하기 5 문제풀이, 파이썬
백준 11660번 구간 합 구하기 5 문제풀이, 파이썬
백준 11660번 : 구간 합 구하기 5 문제풀이 [파이썬] 11660번 문제의 내용은 아래와 같습니다. 구간 합 구하기 5 문제 N×N개의 수가 N×N 크기의 표에 채워져 있다. (x1, y1)부터 (x2, y2)까지 합을 구하는
inho3213.tistory.com
2차원 배열은 아직 헷갈리는 부분이 많아서 (특히 index 부분)
실수를 계속해서 하게되는거 같아, 이번 역시도 그림을 그려서 풀었다.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 내가 푼다고 끄적인거라 이해는 잘 안되겠지만....
2차원 배열만 나오면 자꾸 index 부분에서 실수해서 짜증나서 맘 편하게 하나하나 써서 풀고 일반화해서 코드 작성했다.
import sys
N, M = map(int, sys.stdin.readline().split())
nums = []
prefix_sum = [[0] *(M+1) for _ in range(N+1)]
for _ in range(N):
nums.append(list(map(int, sys.stdin.readline().split())))
우선 위처럼 문제에서 요구하는 입력값을 받기 위해
위와 같은 코드를 작성해주었다.
반복문을 돌면서 문제에서 주어진 2차원 배열을 할당할 nums라는 이름의 배열을 선언하고,
그 누적합을 할당할 prefix_sum 이라는 이름의 배열 또한 만들었다.
for i in range(1,N+1):
for j in range(1,M+1):
prefix_sum[i][j] = nums[i-1][j-1] + prefix_sum[i-1][j] + prefix_sum[i][j-1] - prefix_sum[i-1][j-1]
다음으로는 위처럼 이중 반복문을 돌면서 prefix_sum에 누적합을 할당해주었다.
K = int(sys.stdin.readline())
for _ in range(K):
i, j, x, y = map(int, sys.stdin.readline().split())
print(prefix_sum[i-1][j-1] + prefix_sum[x][y] - prefix_sum[i-1][y] - prefix_sum[x][j-1])
마지막으로는 위와 같이 코드를 작성해서 출력 부분을 해결하였다.
본 문제는 지난 2차원 배열과 다르게 그 배열의 크기가
단순히 N * N 이 아니라 조금 어려웠다.
따라서 주어진 구간에 따라서 결과값을 뽑는것이 이전과 같은 방식으로는 해결되지 않아서
위처럼 그림을 그려서 직접 해보고, 일반화해서 코드로 구현하는 방식을 사용했다.
'백준 알고리즘' 카테고리의 다른 글
백준 2851번 슈퍼 마리오 문제풀이, 파이썬 (0) | 2023.04.20 |
---|---|
백준 2559번 수열 문제풀이, 파이썬 (0) | 2023.04.19 |
백준 1806번 부분합 문제풀이, 파이썬 (1) | 2023.04.16 |
백준 11660번 구간 합 구하기 5 문제풀이, 파이썬 (1) | 2023.04.15 |
백준 11659번 구간 합 구하기4 문제풀이, 파이썬 (0) | 2023.04.13 |