본문 바로가기

programming language/C 언어

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

<문제2> p349

그림(그림 생략)에서 제시하는 배열 A와  B를 보고, 배열 A는 선언과 동시에 초기화를 하고, 배열 B는 반드시 배열 A를 이용해 초기화를 진행해주어야 하는 문제이다.

 

<내 처음 풀이> (오답)

#include<stdio.h>
int main(void)
{
	int arr[2][4] = {
		{1,2,3,4},
		{5,6,7,8}
	};
	int arr2[4][2];

	int i, j;
	for (j = 0; j < 4; j++)
	{
		for (i = 0; i < 2; i++)
		{
			arr2[j][i] = arr[i][j];
		}
	}
	for (j = 0; j < 4; j++)
	{
		for (i = 0; i < 2; i++)
			printf("%d", arr[j][i]);
		printf("\n");
	
	}
	
     return 0;
}

풀이 방식은 맞았으나, 마지막 printf문을 보면 왜 이풀이가 맞지 않는지 알 수 있을 것이다. 배열 arr2의 요소 값들을 출력해주려고 배열 B에 맞는 반복문을 설정해주었으나, 배열 A를 출력하는 꼴이 되어버렸으니, 출력 값이 이상하게 나온 것은 당연하다. 배열 A는 arr [2][4]이므로 존재하지 않는 배열 요소 값을 출력을 요청하니 의미 없는 값이 나오게 되었다.


<문제 2>   (정답)

#include<stdio.h>
int main(void)
{
	int arr[2][4] = {
		{1,2,3,4},
		{5,6,7,8}
	};
	int arr2[4][2];
	int temp = 0;
	int i, j;
	for (j = 0; j < 4; j++)
	{
		
		for (i = 0; i < 2; i++)
		{
			temp = arr[i][j];
			arr[i][j] = arr2[j][i];
			arr2[j][i] = temp;
		}
	}
	for (j = 0; j < 4; j++)
	{
		for (i = 0; i < 2; i++)
			printf("%2d", arr2[j][i]);
		printf("\n");
	
	}
	
     return 0;
}

마지막 printf문에서의 실수만 잡아주면 됐는데, 그걸 발견하지 못하고, 분명 돼야 하는데 안되니 다른 방식으로 int temp를 선언해주어서 값을 서로 바꿔주는 식으로 풀이를 작성해 보았다. 했는데도 또 출력이 안되니 집중해서 작성한 코드를 읽어나갔고 마지막에 실수가 있었다는 사실을 발견하였다. 그래도 다른 방식으로 생각할 수 있는 기회를 얻어서 좋다고 생각한다.


 

<내 두번쨰 풀이 답지와 동일>

#include<stdio.h>
int main(void)
{
	int arr[2][4] = {
		{1,2,3,4},
		{5,6,7,8}
	};
	int arr2[4][2];
	int temp = 0;
	int i, j;
	for (j = 0; j < 4; j++)
	{
		
		for (i = 0; i < 2; i++)
		{
			arr2[j][i] = arr[i][j];
		}
	}
	for (j = 0; j < 4; j++)
	{
		for (i = 0; i < 2; i++)
			printf("%2d", arr2[j][i]);
		printf("\n");
	
	}
	
     return 0;
}

아까 전의 풀이를 바로 잡아서 코드를 작성하였고 마지막에 % 2d를 통해 2칸씩 사용하여 출력하도록해 그림과 유사하게 출력을 해보았다.