자료구조/수업

6. 배열(3-2)

멜데스 2017. 5. 4. 03:28

 1. 배열의 개념 

 배열(array) 

 프로그램 상에서 관련된 자료들이 공통된 성질을 가지고 어떤 규칙에 따라 연속적인 기억 장소의 집합으로 정해진 인덱스의 값들이 사상 

  (mapping)에 의해 이루어진 것 

 C 언어에서 배열의 선언 형식 

자료형 배열명[첨자1][첨자2] …[첨자 n] ; 

 예  

int score[10];    //과목별 성적을 저장하기 위한 배열 선언 

for(i=0; i<10; i++) 

        sum += score[i];    //과목별 합계 계산 

 int score[10]; 

 배열명(array name)  

 score는 배열에 부여된 이름 

 배열 요소(array element) 

 score[0], score[1],  , score[9]와 같이 배열을 구성하는 요소 

 첨자(subscript) 

 [ ] 속의 숫자, 

 특히 score[i]와 같이 [ ]속에 있는 변수 i를 첨자 변수(subscripted variable)라 한다.  

 C 언어에서 배열의 첨자는 0(zero)를 포함한 양의 정수값을 가지는 정수형 상수, 기호상수, 변수, 그리고 산술식을 사용하여 

      나타낼 수 있다.  이때 첨자는 0(zero)에서 부터 시작하여 [배열요소 수 - 1] 사이의 값을 가진다. 



 리스트(list)란? 

 자료 원자(atom)들의 논리적, 순서적인 집합으로 인덱스(index)나 포인터(pointer)에 의해 비 순서적으로도 검색할 수 있는 자료구조 

 예를 들면, 문자 스트링(character string), 배열(array), 디스크(disk)나 테이프(tape) 같은 매체에 저장된 파일(file)도 리스트의 일종 

         ※ 원자(atom) : field라 불리우는 서로 연관된 항목(item)들의 모임 


2. 1차원 배열 

 첨자를 하나만 가진다. 

 배열 중에 가장 단순한 구조 

 벡터(vector) 구조라고도 한다.  

 A[n]을 크기가 n인 1차원 배열이라고 할 때 배열 요소 A[0], 

         A[1],  A[n-1]의 메모리 위치가 효율적으로 결정될 수 있는 표현 방법 

 크기가  n 인 1차원 배열 A 

A[0]  A[1]  …  A[i]  …  A[n-1] 

 배열 표현 

 배열의 범위, 즉 하한값과 상한값을 명시하는 방법 

배열명(하한값:상한값) 

 예를 들어, A(L:U) = {A(i) | i = L, L+1,  , U-1, U}  

 1차원 배열 A의 요소의 개수 = U - L + 1 

 배열 A에서 인덱스가 i인 요소 A(i)의 주소 = B + (i - L) * k 

 예제) 1차원 배열 A[10]에서 배열의 시작주소가 100번지이고, 요소의 

    길이가 2바이트로 되어있는 경우, 임의의 6번째 요소(즉 A[5]의 주소를 

        계산하라. (단,  C언어의 경우 배열의 첫 번째 요소의 첨자는 0로 시작한다.) 

A[5]의 위치 = 시작주소 + (i - 0) ×10byte 

                           = 100 + (5 - 0) ×2 = 110번지 

 

3. 2차원 배열 

 2차원 배열 

 논리적으로 행과 열을 나타내는 두 개의 첨자로 각각의 배열 요소로 구분된다 

 행렬(matrix) 구조 

 2차원 배열을 선언하는 형식 

배열명[첨자1][첨자2]; 

또는 

배열명(하한값1 : 상한값1,  하한값2 : 상한값2) 


 2×3 배열, 즉 A[2][3] 또는 A(0:1, 0:2)인 배열을 논리적으로 표현한 예 

기억장소에 저장방법


 2차원 배열의 원소 개수 

 2차원 배열 A(r : m, c : n)라 할 때,  

                 배열 A의  행의 개수 = m - r + 1 

             배열 A의  열의 개수 = n - c + 1 

       

             이므로 배열 A의 총 원소의 개수는 다음과 같다. 

          배열 A의 총 원소의 개수 = 행의 개수 × 열의 개수 

                                                  = (m-r+1)×(n-c+1) 

 

 행 우선 방법(row-major order) 

 (예) 2차원 배열 A[2][3]의 경우 행 우선으로 표현하면 

 A[0][0]  A[0][1]  A[0][2]  A[1][0]  A[1][1]  A[1][2] 

 사용되는 언어 : COBOL, PL/1, PASCAL, C 등 

      행 우선으로 저장되는 2차원 배열 A[m][n]에서 특정 배열 요소 

    A[i][j]의 주소는 A[0][0]를 시작 주소 α 라 할 때 다음과 같이 계산 할 수 있다. 

2차원 배열 A[i][j]의 주소 = 시작주소 + (i - 1) X 열의개수 + (i - j) 

                                               = α + (i - 1) + (j - 1) 

 

 만약,  2차원 배열 A[m][n]에서  A[0][0]의 주소가 1일 경우 

2차원 배열 A[i][j]의 주소 = (i - 1)n + j 


 C언어의 경우, 2차원 배열 A[m][n]에서 특정 배열 요소 A[i][j]의  

    주소는 A[0][0]을 시작  주소 α 라 하고 각 요소의 크기를 k 바이트라 할 때 

2차원 배열 A[i][j]의 주소 = 시작주소 + (I X 열의개수 + j) X 배열요소의 크기 

                                       = α + (i X n + j) X k 

 

 열 우선 방법(column-major order) 

 2차원 배열 A[2][3]의 경우 열 우선으로 표현하면  

     A[0][0]  A[1][0]  A[0][1]  A[1][1]  A[0][2]  A[1][2] 

      사용되는 언어: FORTRAN 

      열 우선으로 저장되는 2차원 배열 A[m][n]에서 특정 배열 요소  

    A[i][j]의 주소는 A[0][0]를 시작  주소 α 라 할 때 다음과 같이 

    계산 할 수 있다. 

2차원 배열 A[i][j]의 주소 = 시작주소 + (j - 1) X 행의개수 + (i - 1) 

                                       = α + (j - 1)m + (i - 1) 

 

 만약,  2차원 배열 A[m][n]에서  A[0][0]의 주소가 1일 경우 

2차원 배열 A[i][j]의 주소 = (j - 1)m + i 

 

 C언어의 경우, 2차원 배열 A[m][n]에서 특정 배열 요소 A[i][j]의 

    주소는 A[0][0]을 시작  주소 α 라 하고 각 요소의 크기를 k 바이트라 할 때 

 

2차원 배열 A[i][j]의 주소 = 시작주소 + (j X 행의개수 + i) X 배열요소의 크기 

                                           = α + (j X n + i) X k