5행 6열의 2차원 배열을 선언하고 4행 5열 부분은 1부터 20까지 초기화 시킵니다.
초기화된 배열에서 마지막 열의 요소에는 각행의 합을 저장하고 마지막 행의 요소에는 각 열의 합을 저장한 후 전체 배열의 값을 출력하세요.
1 | 2 | 3 | 4 | 5 | 0 |
6 | 7 | 8 | 9 | 10 | 0 |
11 | 12 | 13 | 14 | 15 | 0 |
16 | 17 | 18 | 19 | 20 | 0 |
0 | 0 | 0 | 0 | 0 | 0 |
먼저 이렇게 초기화 한 후 끝행 끝열에는 각 행과 열의 합을 저장하면 되는 문제다.
내가 처음에 제출 했던 답이다.
#include<stdio.h>
int main()
{
int arr[5][6];
int count = 0;
int horizontal = 0;
int vertical = 0;
for (int i = 0; i < 5; i++) //repeat 5x6
{
for (int j = 0; j < 6; j++)
{
if (i < 4 && j < 5) //repeat 4x5 counting count 1 ~ 20
{
arr[i][j] = ++count;
horizontal += count; //horizontal count
}
else if (j == 5) //last column
{
arr[i][j] = horizontal; //horizontal assign
horizontal = 0; //reset horizontal to 0
}
}
}
for (int i = 0; i < 6; i++) //repeat 6x5 again for vertical calculation
{
for (int j = 0; j < 5; j++)
{
if (j == 4) //last row
{
arr[j][i] = vertical; //assign last low to vertical
vertical = 0; //reset vertical to 0
}
else
{
vertical = vertical + arr[j][i]; //vertical accumulate
}
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 6; j++)
{
printf("%3d ", arr[i][j]);
}
printf("\n");
}
}
답을 어떻게든 도출하긴 했다. count 라는 누적 변수를 써서 하나씩 더하면서 배열을 완성해 나갔고,
if문을 사용해서 누적시킨 값을 가로, 세로값에 대입했다.
한눈에 보기에도 가독성이 떨어지고, 주석이 굉장히 많이 필요했다.
모범답안을 향해 가면서 if문을 사용하지 않아도, 마지막 행/열을 for문에서 제외하면서 독립적으로 값을 누적시킬 수 있는 방법이 있다는것을 깨달았다.
출력함수까지 따로 만들게 되면서 아래와 같은 형태로 모범답안이 완성 되었다.
#include<stdio.h>
void PrintArr(int arr[][6], int row, int column);
int main()
{
int arr[5][6] = { 0 }; //initialize to 0 all array
for (int i = 0; i < 4; i++) //4x5 repeat
{
for (int j = 0; j < 5; j++)
{
arr[i][j] = 5 * i + j + 1; //initialize 4x5 array
arr[i][5] += arr[i][j]; //last column accumulate
arr[4][j] += arr[i][j]; //last row accumulate
arr[4][5] += arr[i][j]; //arr[4][5] accumulate
}
}
PrintArr(arr, 5, 6);
}
void PrintArr(int arr[][6], int row, int column)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
printf("%3d ", arr[i][j]);
}
printf("\n");
}
}
arr[i][5]와 arr[4][j] arr[4][5]는 각각 for문의 밖에 있기 때문에(for문의 조건에서 i는 0,1,2,3 까지, j는 0,1,2,3,4 까지 순환하기 때문)
i, j 가 순환 될때는 영향을 받지 않는 독립적인 공간에 존재한다.
때문에 if문을 사용하지 않고도 값을 대입하는데에 있어 자유로웠다.
첫 문장에서 0으로 초기화 되어있었기 때문에 arr[i][j]값을 누적시키는것도 쉬웠고
이렇게 코드를 짜니 가독성도 뛰어나고 주석도 대폭 줄어들었다.
'문제풀이' 카테고리의 다른 글
초보자를 위한 C++ 200제 42번 문제 해석 피라미드 출력 (0) | 2023.07.04 |
---|---|
혼자 공부하는 C언어 도전 실전 예제 풀어 보기 (315p) (0) | 2023.04.19 |
백준 25304번 반복문 기초문제 영수증 (0) | 2023.04.14 |
백준 2480번 서로다른 3개의 수의 크기 비교 하기 (0) | 2023.04.11 |
백준 2884번, 2525번 시간 계산의 알고리즘 (0) | 2023.04.11 |