2차원 배열의 행과 열 합계 채우기
문제
다음과 같은 2행 3열 배열이 있다.
10 20 30
40 50 60
각 행의 합계를 마지막 열에 넣고, 각 열의 합계를 마지막 행에 넣어 3행 4열 배열을 완성한다.
최종 결과는 다음과 같아야 한다.
10 20 30 60
40 50 60 150
50 70 90 210
풀이
#include <stdio.h>
#define ROW_COUNT 3
#define COL_COUNT 4
int main(void)
{
int arr[ROW_COUNT][COL_COUNT] =
{
{ 10, 20, 30, 0 },
{ 40, 50, 60, 0 },
{ 0, 0, 0, 0 }
};
// Fill the last column with row sums.
for (int row = 0; row < ROW_COUNT - 1; row++)
{
for (int col = 0; col < COL_COUNT - 1; col++)
{
arr[row][COL_COUNT - 1] += arr[row][col];
}
}
// Fill the last row with column sums.
for (int col = 0; col < COL_COUNT; col++)
{
for (int row = 0; row < ROW_COUNT - 1; row++)
{
arr[ROW_COUNT - 1][col] += arr[row][col];
}
}
for (int row = 0; row < ROW_COUNT; row++)
{
for (int col = 0; col < COL_COUNT; col++)
{
printf("%-4d", arr[row][col]);
}
putchar('\n');
}
return 0;
}
3행 4열을 좌표로 나타내면 다음과 같다.
(0, 0) (0, 1) (0, 2) (0, 3)
(1, 0) (1, 1) (1, 2) (1, 3)
(2, 0) (2, 1) (2, 2) (2, 3)
합계를 구하려면 마지막 행에 각 열의 합계를 먼저 채운 뒤, 각 행의 마지막 열에 행 합계를 채울 수 있다.
계산 순서를 반대로 해도 결과는 같다.
행 합계를 채울 때는 행 고정, 열 변화 방식으로 값을 읽는다.
즉, 하나의 행을 고정한 뒤 열 번호를 바꾸며 왼쪽에서 오른쪽으로 값을 읽는다.
최종 결과 배열은 3행 4열이지만, 처음부터 값이 들어 있는 영역만 보면 2행 3열이다.
그래서 반복문을 2행 3열 범위까지만 돌면서, 접근한 값들을 각 행의 마지막 열에 누적한다.
배열의 인덱스는 0부터 시작하므로 마지막 열에 접근하려면 COL_COUNT - 1을 사용해야 한다.
열 합계를 채울 때는 열 고정, 행 변화 방식으로 값을 읽는다.
즉, 하나의 열을 고정한 뒤 행 번호를 바꾸며 위에서 아래로 값을 읽는다.
예를 들어 0번 열은 (0, 0)과 (1, 0)을 읽어 (2, 0)에 누적한다.
1번 열은 (0, 1)과 (1, 1)을 읽어 (2, 1)에 누적한다.
이처럼 열 번호가 고정된 상태에서 행 번호가 변하므로 바깥 반복문은 col, 안쪽 반복문은 row가 된다.