easy software

C언어 2차원배열을 1차원으로 구현해보자 본문

C언어/포인터와 배열

C언어 2차원배열을 1차원으로 구현해보자

JAVA 웹개발자 2015. 1. 25. 22:01

안녕하세요. 이번 시간에는 2차원 배열을 1차원 배열로 변환하는 연습을 해보려합니다.

 

1차원배열은 예전에 제 블로그에 올려뒀던 내용을 학습하시면 될거같습니다.

 

2차원배열에 대해서는 처음 언급을 하는데요, 간단하게 설명드리고 바로 문제를 보겠습니다.

 

 

2차원 배열이란?

 

1차원 배열을 여러개 포개어 놓은 것이라고 생각하시면 됩니다.

 

1차원은 선만있는 것이죠?

 

그러므로 1차원배열은 선형형태로써 한줄로 나열하는 구조가 됩니다.

 

2차원은 x축과 y축의 개념이 들어가죠?

 

그러므로 2차원 배열은 아래와 같은 구조가되며, 1차원배열을 포개어 놓은것으로 생각할 수 있습니다.

 

 

 

 

위의 배열은 세로가3이고 가로가3인 배열입니다.

 

1차원배열 3개를 포개어놓은 것 같지요?

 

2차원 배열의 선언은 int arr[3][3]; 의 형식으로 선언합니다.

 

대괄호안에있는 숫자들은 세로, 가로 순입니다.

 

그리고 초기화 하는 방법은

 

int arr[3][3] = {{1, 2, 3},

      {4, 5, 6},

      {7, 8, 9}};

 

의 형식으로 할 수 있습니다.

 

7은 위의 그림에서 arr[2][0] 인덱스에 삽입이 되는것이지요.

 

int arr[3][3] = {{1},

      {4, 5},

      {7, 8, 9}};

 

이렇게 선언하면 어떻게 될까요?

 

위의 그림의 (0,1), (0,2), (1,2)의 배열안에 0이라는 값이 자동적으로 입력됩니다.

 

위의 초기화 방법이 직관적으로는 보기좋으나, 1차원 배열처럼 쭈욱 한줄에 나열해도 됩니다.

 

다만, int arr[][] = {1,2,3,4,5,6,7,8,9};

 

와 같이 입력하면 어떻게 될까요?

 

컴파일이 세로가 몇줄이고, 가로가 몇줄인지 계산해서 1차원 배열처럼 자동적으로

 

배열공간을 생성해 줄까요?

 

그렇지 않습니다.

 

2차원 배열에서는 반드시 가로길이를 적어줘야 합니다.

 

int arr[][3] = {1,2,3,4,5,6,7,8,9}; 처럼 가로길이를 정해주면

 

세로길이는 알아서 계산하여 배열을 생성해줍니다.

 

자, 이정도로 2차원 배열의 설명을 마치고 바로 문제로 들어가겠습니다.

 

 

 

일단 아래의 코드는 2차원 배열로 작성된 코드입니다.

 

소망빌라는 4층이며, 층당 2개의 가구가 존재합니다.

 

사용자로부터 각층의 각가구마다 몇명이 사는지를 입력받고,

 

각층의 모든 가구의 수를 더해서 출력해주면 됩니다.

 

#include <stdio.h>

 

int main(void){

int somang[4][2];

int i, j;

int popu;

 

//가구별 거주 인구 입력

for(i=0; i<4; i++){

for(j=0; j<2; j++){

printf("%d층 %d호 인구 입력 : ", i+1, j+1);

scanf_s("%d", &somang[i][j]);

}

}

 

//소망 빌라 층별 인구 수 출력

for(i=0; i<4; i++){

popu=0;

for(j=0; j<2; j++){

popu+=somang[i][j];

}

printf("%d층 전체 인구 : %d \n", i+1, popu);

}

return 0;

}

 

 

 

 

이제 이 코드를 1차원배열로 변환하여 구현해보겠습니다.

 

주석을 상세히 달아놨으니 2차원과 1차원 배열 두개를 그림으로 그려가면서

 

비교해가며 코드를 작성하시거나, 또는 제 코드를 봐주시기 바랍니다.

 

#include <stdio.h>

 

int main(void){

 

     int somang[8];//[4][2]짜리 2차원배열을 1차원배열로 정의
     int count = 0;//가구별 거주 인구 입력시 사용할 변수
     int count2 = 0;//전체 인구 계산시 사용할 변수
     int popu;//전체 인구 계산시 사용할 변수

 

     //가구별 거주 인구 입력
     for (int i = 0; i < 4; i++){
          for (int j = 0; j < 2; j++){
               printf("%d층 %d호 인구 입력 : ", i + 1, j + 1);


               //count++를하여 1차원배열의 다음인덱스로 순차적 접근
               scanf_s("%d", &somang[count++]);
          }
     }

 

     //소망 빌라 층별 인구 수 출력
     for (int i = 0; i < 4; i++){
          popu = 0;//층이 바뀔때마다 인구수 초기화


          //층의 첫번째 집의 인구수를 더하고 count값 증가로 다음인덱스로 접근
          popu += somang[count2++]; 


          //층의 첫번째 집의 인구수를 더하고 count값 증가로 다음인덱스로 접근
          popu += somang[count2++];


          printf("%d층 전체 인구 : %d \n", i + 1, popu);
     }

     return 0;
}

 

제 코드를 1차원 배열로 표현하면 아래와 같습니다.

 

실제 1차원 배열의 인덱스는 0~7까지 이지만,

 

2차원 배열의 인덱스를 1차원으로 옮겨놓으면 저런 형식으로 된다고 생각하면 됩니다.

 

어떠셨나요?

 

솔직히 말씀드리자면, 현실세계의 1차원의 객체이면

 

C언어를 통해서도 1차원으로 구현을

 

2차원이면 C언어에서도 2차원적으로 구현을 하는 것이 바람직합니다.

 

다만, 위와 같이 차원을 변환하여 구현하는 것도 좋은 학습방법이 될 수 있으니

 

꼭 이해하고 넘어가시기 바랍니다.

Comments