본문 바로가기

programming language/C 언어

열혈c프로그래밍 문제16-1번(2차원 배열 활용)

<내 처음 풀이>

#include<stdio.h>
int main(void)
{
	int arr[5][5];
	int i, j;
	int total = 0;
	
	for(i =0;i<4;i++)
		for (j = 0; j < 4; j++)
		{
			scanf("%1d",& arr[i][j]);
		}
	//가로 줄 더하기
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
			total += arr[i][j];
			arr[i][4] = total;
	}
    //세로 줄 더하기
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 4; j++)
			total += arr[j][i];
		arr[4][i] = total;
	}

	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
			printf("%3d", arr[i][j]);
		printf("\n");
	}
	return 0;
}

이렇게 코드를 작성해주면 문제가 하나 있는데, total의 값이 계속 누적이 되어 올바르지 않은 출력 값을 보게 된다는 것이다. total의 변수는  for문에서 만들어진 지역변수가 아니라,  main함수에서 선언이 된 지역변수 이므로, 계속 이렇게 값이 축적되고 늘어나게 되었던 것이다. 


<다시 푼 내 풀이>

#include<stdio.h>
int main(void)
{
	int arr[5][5];
	int i, j;
	
	
	for(i =0;i<4;i++)
		for (j = 0; j < 4; j++)
		{
			scanf("%1d",& arr[i][j]);
		}
	//가로 줄 더하기
	for (i = 0; i < 4; i++)
	{
		int total = 0;
		for (j = 0; j < 4; j++)
			total += arr[i][j];
			arr[i][4] = total;
	}
    //세로 줄 더하기
	for (i = 0; i < 5; i++)
	{
		int total = 0;
		for (j = 0; j < 4; j++)
			total += arr[j][i];
		arr[4][i] = total;
	}

	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
			printf("%3d", arr[i][j]);
		printf("\n");
	}
	return 0;
}

total을 main함수의 지역변수가 아닌 각 for문내의 지역변수로 설정 해줌으로써 total의 값이 계속해서 중첩이 되는 일이 없어졌다. 출력 결과는 예제에서 보이는 결과와 동일하다.

 

<책에 나온 풀이> 가 있는데, 책 내에서도 책 내의 풀이에 대해 지금 단계에서의 풀이 일뿐, 개선되어야 한다고 얘기하고 있으므로, 이곳에 적진 않고 혼자 공부하도록 하겠다. 

 

위의 내풀이도 사람들의 수가 늘어나거나 과목의 수가 늘어날 경우 분명 보완이 필요한 풀이이다. 이 풀이의 방법을 고집해서 한다면 어떤 식으로 보완해 나가야 할지 알 것 같지만, 앞으로 더 배우며 조금 더 적절한 방법의 풀이를 사용할 수 있기를 바란다.