본문 바로가기

공부/c언어 기초

2차원 배열

배열이 필요한 이유

아래와 같이 크기가 같은 변수를 나열해서 적는 것이 불편하기 때문에 같은 크기의 변수들을 묶어서 사용한다.

-> char data1, data2, data3, data4

 

 

 

만약 char data1 [4], data2[4], data3[4], data4[4], data5[4]와 같은 경우가 있다면

5개의 일차원 배열들은 char[4]를 공통적으로 가지고 있음으로 배열을 이용하여 묶을 수 있다.

 

 

 

  char      data           [5]               [4]

자료형 변수이름 [행의 개수]  [열의 개수]

 

 

char [5][4];

이때 앞에 있는 [ ]는 group의 개수를 의미하고 (수학적으로는 y축)

뒤에 있는 [ ]는 항목의 개수를 의미한다. (수학적으로 x축)

[0][0] [0][1] [0][2] [0][3]
[1][0] [1][1] [1][2] [1][3]
[2][0] [2][1] [2][2] [2][3]
[3][0] [3][1] [3][2] [3][3]
[4][0] [4][1] [4][2] [4][3]

 

 

 

왜 y축, x축 순서인가?

-> 연산자 우선순위 때문

동일한 우선순위를 가진다면 왼쪽에서 오른쪽으로 연산을 실행한다.

 

 

 

컴파일할 때는 2차원 배열들은 전부 1차원 형태로 변환된다.

[0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] [3][0] [3][1] [3][2] [3][3] [4][0] [4][1] [4][2] [4][3]

 

 

2차원 데이터와 1차원 데이터를 서로 변환하는 법

 

대부분 컴파일러가 2차원 데이터를 1차원 형태의 기계어로 번역해 주지만 수학 공식을 이용할 수 있다.

 

 

돌번호 = (행번호-1)*열 개수 +(열번호-1)

 

행번호 = (돌번호/열 개수)+1 

// 이때 몫 +1 임을 주의하자

 

열번호 = (돌번호%열 개수)+1

//이때 나머지 +1 임을 주의하자

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
16 17 18 19

 

 

메모리의 저장되는 형태만 놓고 보면 2차원 배열로 선언한 변수와 1차원 배열로 선언한 변수는 메모리 형태가 같다.

(단 data [m][n], test[l]에서 m*n=l일 때 성립)

 

 

 

2차원 배열을 이용한 바둑알 문제

 

 

1차원 배열 바둑판 문제

반응형