Search
Duplicate
📗

2차원 배열의 합

주차
문제번호
2167
언어
티어
브론즈
유형
DP
nj_Blog
nj_상태
이해도
100%
풀이
사람
이해도 2
13 more properties

문제접근

1.
첫번째 접근
1차원 배열로도 문제를 해결할 수 있을 것으로 예상이 되지만, 인덱스 조절을 하는데에 반복적으로 연산의 과정을 거치게 될 거 같아서 2차원 배열로 푸는 것도 가독성 측면이나, 성능측면에서도 나쁘지 않은 선택이 될 거 같음
배열의 합이 23112^{31}-1보다 작거나 같다 의 조건은 배열의 합이 int형의 범위를 넘지 않음에 대해 힌트를 준 것으로 판단
배열을 입력 받고 i, j, x, y를 통해서 (i, j) 부터 (x, y) 까지 인덱스 접근을 하나하나하여 누적합을 구하면 될듯
최악의 경우, N = 300 M = 300 K = 10000인 상황에서도 연산은 10억을 넘지 않기 때문에 시간 제한도 괜찮을 것으로 판단
가독성을 위하여 인덱스는 (0, 0)이 아닌 (1, 1)부터 시작
//pseudo code cin >> n,m cin >> 2차원배열 while(k--) { cin >> i,j,x,y while( <= n && <= x) while( <= m && <= y) sum += '2차원 배열의 해당인덱스의 값' cout << sum } //초기화 잘하기
C++
복사
이 흐름대로면 (1,2) (2,3)에서 올바른 값을 구할 수가 없음
while 안에서 인덱스에 대한 초기화가 계속 일어나더라도, (1,2) (1,3) (2,1) (2,2) (2,3)을 구하는 것이 아니라 (1,2) (1,3) (2,2) (2,3) 을 구하게 됨. 이 부분에 대해서 더 생각할 필요가 있어 보임
→ 문제를 잘못 이해했었는데 이 접근이 맞음
2.
두번째 접근
첫번째 접근에서는 인덱스 접근을 이중루프문으로만 해결을 하려고 했음
→ 시작하는 좌표 즉, (i,j)에 대한 접근을 하는 루프문 하나와 중간에 대한 접근 그리고 마지막 (x,y)를 접근하는 루프문 3개로 만들어서접근을 진행을 하면 될듯
//pseudo code cin >> n,m cin >> 2차원배열 while(k--) { cin >> i,j,x,y while (j <= m) //첫좌표에 해당하는 같은 행들에 대한 연산 while (i + 1 <= x - 1) // 그 다음 행들부터 마지막 좌표가 포함된 행 전까지에 대한 연산 while ( <= m) //첫좌표와 마지막좌표 사이의 행들에 대한 연산 while ( <= y) //마지막좌표에 해당하는 같은 행들에 대한 연산 cout << sum } //index 초기화 조심
C++
복사
틀림...
→ i,j,x,y가 같은 행이거나 같은 값이면 올바른 논리가 적용되지 않음
(1,2) (1,2)에 대해 올바른 계산이 나오지 않음
3.
세번째 접근
1차원으로 접근하는 방식이 생각보다 나쁘지 않을듯
입력값을 1차원에 저장을 해두고 예를 들어 (2,3)에 접근을 하고 싶으면 2*3=6, 즉 1차원 배열의 6번째에 접근을 하면 되는것
//pseudo code cin >> n , m , k cin >> 1차원 while(k--) { cin >> i,j,x,y while (i*j <= x*y) 누적합 cout << 누적합 << "\n" }
C++
복사
→ 문제를 완전히 잘못 이해함.........
(1,3) (2,3) 을 입력 받으면,
빨강세모를 계산하는게 아니라 파란원을 계산해야함
결국 첫번째 접근이 정답이었음..

놓쳤던 부분

문제를 잘못 이해해서 잘못 접근함

코드

2416 KB

572 ms

#include <iostream> #include <vector> int n,m,k; std::vector<std::vector<int> > input_arr; void input_setting() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { int i,j; i = 0; std::cin >> n >> m; input_arr.resize(n + 1, std::vector<int>(m + 1, 0)); while (++i <= n) { j = 0; while (++j <= m) std::cin >> input_arr[i][j]; } std::cin >> k; } void solution() { int i, j, x, y; int row, col; int sum; while (k--) { sum = 0; std::cin >> i >> j >> x >> y; row = i - 1; while (++row <= n && row <= x) { col = j - 1; while (++col <= m && col <= y) sum += input_arr[row][col]; } std::cout << sum << "\n"; } } int main(void) { input_setting(); input(); solution(); return (0); }
C++
복사