언어/C

배열

빨대도둑 2022. 10. 27. 09:47

「배열」: 많은 값을 한 번에 저장할 수 있는 저장소

> 배열은 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 저장 장소이다. 배열 안에 들어있는 각각의 데이터들은 정수로 되어 있는 번호에 의해 접근된다. 배열 이름에 번호를 붙여서 각각의 데이터들을 접근한다. 

- 배열은 메모리의 연속적인 공간에 저장된다.

- 배열의 가장 큰 장점은 서로 관련된 데이터를 차례로 접근하여 처리할 수 있다는 점이다. 

 

「배열의 선언」

자료형 배열이름[요소의 개수]

->
int score[10];
float cost[12];
char src[10], dst[10];
int indwx, days[7];

 

「배열과 반복문」

> 배열의 가장 큰 장점은 반복문을 사용해서 배열의 요소를 간편하게 처리할 수 있다는 점이다. 

scores[0]=0;
scores[1]=0;
scores[2]=0;
scores[3]=0;
scores[4]=0;

->
#define SIZE 5
...
for(int i=0;i<SIZE;i++)
	scores[i]=0;

 

- 인덱스의 범위

> 배열을 사용할 때 조심해야 하는 부분이 배열 인덱스 범위이다. 인덱스가 배열의 크기를 벗어나게 되면 오류를 발생한다.

 

- 배열의 초기화

> 배열을 초기화하려면 초기값들을 콤마로 분리하여 {중괄호}로 감싼 후에, 배열을 선언할 때 대입해주면 된다. 초기화만 하고 배열의 크기를 비워두면 컴파일러가 자동으로 초기값들의 개수만큼 배열의 크기를 잡는다.

int scores[5]={0};

 

- 배열 요소의 개수를 계산

> 배열 안에 들어있는 요소의 개수를 자동으로 계산하려면 sizeof 연산자를 사용하면 된다. sizeof 연산자를 이용하면 배열 전체의 크기를 구하고 이것을 배열의 요소의 크기로 나누게 되면 배열 요소가 몇 개나 있는지 쉽게 계산할 수 있다. 

int size = sizeof(scores)/sizeof(scores[0]);

 

- 배열의 복사> 하나의 배열을 다른 배열로 복사하려면반복구조를 사용해서 배열의 요소를 하나씩 복사해주어야 한다. 

int i;
int a[SIZE]={1,2,3,4,5};
int b[SIZE];

for (i=0;i<SIZE;i++)
	b[i]=a[i];

 

- 배열의 비교

int a[SIZE]={1,2,3,4,5};
int b[SIZE]={1,2,3,4,5};

for(i=0;i<SIZE;i++){
	if(a[i]!=b[i]){
    	printf("diff \n");
        break;
    }
}

 

「배열과 함수」

> 배열도 함수로 전달할 수 있다. 하지만 변수를 전달할 때와는 다르다. 우리는 함수 호출 시에 "값에 의한 호출"이 이루어진다는 것을 알고 있다. "에 의한 호출"이란 함수를 호출할 때 인수의 값이 매개 변수로 복사되는 것을 의미한다. 그러나 배열의 경우에는 단순한 "값에 의한 호출"이 아니다. 배열이 인수인 경우에는 배열의 원본이 매개 변수를 통하여 전달된다.

 

- 원본 배열의 변경

> 배열은 매개 변수를 통하여 원본을 참조하는 것이기 때문에 항상 조심해야 한다. 만약 함수 안에서 매개 변수를 통하여 배열 요소를 변경한다면 이것은 원본 배열을 변경시키는 결과를 가져온다. 

 


「정렬」: 물건을 크기순으로 오름차순, 내림차순으로 나열하는 것을 의마하며, 컴퓨터 공학에 있어서 정렬은 자료 탐색에 있어서 필수적이다. 

- 선택정렬: 선택 정렬은 오른쪽 배열에서 가장 작은 숫자를 선택하여 왼쪽으로 이동하는 작업을 되풀이한다. 선택 정렬은 오른쪽 배열이 공백 상태가 될 때까지 이 과정을 반복하는 정렬 방법이다. 

 

「탐색」

> 탐색의 대상이 되는 데이터는 보통 배열에 저장되어 있다고 가정하고, 문제를 간단하게 하기 위해 단순히 정수들이 배열에 저장되어 있고 여기에서 특별한 정수를 찾는다고 가정하면 우리가 찾는 특정한 정수를 탐색키(search key)라고 한다.

 

- 순차 탐색: 배열의 원소를 순서대로 하나씩 꺼내서 탐색키와 배교하여 원하는 값을 찾아가는 밤법으로 순차탐색은 일치하는 항목을 찾을 때 까지 비교를 계속한다. 순차탐색은 첫 번째 원소에서 성공할 수도 있고 마지막 원소까지 가야 되는 경우도 있다. 평균적으로는 절반정도의 배열 원소와 비교하여아 할 것이다. 순차탐색은 효율이 없어서 별로 좋은 방법은 아니다.

- 이진 탐색: 선형탐색은 시간이 많이 걸리는 탐색 방법이다. 만댝 배열의 크기가 크다면 문제가 된다. 이진 탐색(binary search)은 속도가 아주 빠른 탐색 기법이다. 대신에 탐색하려는 배열이 정렬이 되어 있어야 한다.

> 이진 탐색은 배열의 중앙에 있는 값을 탐색키와 비교한다. 만약 일치하면 탐색키를 찾은것이므로 성공이다. 만약 탐색키가 중앙 원소의 값보다 작으면 우리가 찾고자 하는 값의 배열의 전반부에 있을 것이다. 따라서 탐색의 범위에서 제거할 수 있다. 반대로 탐색키가 중앙원소보다 크면 우리가 찾고자 하는 값의 배열은 후반부에 있을 것이다. 따라서 배열의 전반부는 탐색의 범위에서 제외할 수 있다. 이러한 기법을 남아 있는 숫자들에 대하여 반복적으로 적용한다. 이진 탐색에서는 한 번 비교할 때마다 탐색의 범위가 절반으로 줄어든다.

 

「2차원 배열」

- 2차원 배열은 2개의 대괄호를 이용하여 선언한다. 첫번째 대괄호 안에는 행의 개수, 두 번째 대괄호 안에는 열의 개수를 적는다. 행(row)과 열(column)으로 이야기하면 배열 s는 4개의 행으로 이루어져 있고, 각 행에는 4개의 요소가 있다고 할 수 있다.

int s[행의 개수][열의 개수]

int s[4][4];

 > 2차원 배열에서 하나의 요소를 참조하려면 2개의 인덱스가 필요하다. 

 

- 2차원 배열의 초기화

> 2차원 배열도 1차원 배열과 마찬가지로 선언과 동시에 초기화 할 수 없다. 다만 같은 행에 속하는 초기값들을 {중괄호}로 다로 묶어 주어야 한다. 

> 만약 선언과 동시에 초기화하는 경우 행의 개수는 지정하지 않을 수 있다. 이 경우 컴파일러가 자동으로 행의 개수를 결정한다. 반면 열의 개수는 반드시 지정해야 한다.

> 2차원 배열을 초기화 할 때 안쪽의 종괄호는 생략될 수 있다. 이대 컴파일러가 행의 크기에 따라서 초기값을 자동으로 분류한다. 

int s[3][4]={
	{1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};

int s[][4]={
	{1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};

 

'언어 > C' 카테고리의 다른 글

구조체  (0) 2022.11.07
포인터  (0) 2022.10.27
함수&변수  (0) 2022.10.26
제어문  (0) 2022.10.20
수식과 연산자  (0) 2022.10.20