안 쓰던 블로그
C언어 1차원, 2차원 배열 본문
배열
C언어 자료형 중 int, double 등과 달리 char은 문자를 표현하는 변수입니다. char형은 독립적으로 이용되기도 하지만 문자열을 조작할 수 있는 배열로도 많이 이용됩니다. 배열은 '변수의 집합'으로, 여러 개의 데이터를 동시에 저장하고 조작할 수 있습니다. 배열은 선언 방식에 따라 1차원이나 2, 3차원 등의 다차원 배열로 나누어집니다.
1차원 배열로 예를 들자면,
char a[5];
이렇게 선언하면 a변수는 5문자를 담을 수 있는 문자열 변수가 됩니다.
이외에도
int a[3]; //정수형 변수 3개를 담을 수 있는 배열
double a[33]; //부동소수형 변수 33개를 담을 수 있는 배열
등이 있습니다.
1. 1차원 배열
#include <stdio.h>
int main() {
char a[6] = "HALLO";
printf("%s\n", a);
a[1] = 'E'; //HALLO의 A를 E로 수정
printf("%c\n", a[0]);
printf("%c\n", a[1]);
printf("%c\n", a[2]);
printf("%c\n", a[3]);
printf("%c\n", a[4]);
}
/*
HALLO
H
E
L
L
O
*/
3번 줄) 변수 이름 뒤에 대괄호를 사용해서 배열을 초기화 시킬 수 있습니다. 대괄호 안에 숫자는배열의 크기를 의미합니다. 따옴표 안에 넣어주면 각 자리당 하나의 문자가 매칭됩니다.
5번 줄) 출력은 for문을 돌면서 각 자리를 %c로 출력하는 방법과, %s를 써서 문자열로 출력하는 방법이 있습니다. 여기서는 %s를 사용했습니다.
7번 줄) 배열은 대괄호 안에 자릿값을 넣어서 접근할 수 있습니다. 따로 선언하지 않는 이상 C언어에서 배열의 자릿값은 기본적으로 0번째 자리부터 시작합니다. 이것을 인덱스라고 부르는데, 프로그래밍 언어에 따라 0부터 시작하는지 1부터 시작하는지가 다릅니다(예를 들어 Fortran과 Cobol은 1부터 시작합니다). 이 코드에서는 2번째 문자를 바꾸고 싶으니까 a[1]을 바꿔주면 됩니다.
참고
0부터 시작하는 이유에는 여러 가지가 있습니다. 대표적으로는 2^n개의 수를 이진수로 표현할 때 0부터 시작해야 n자리 수로 딱 떨어지게 표현이 가능합니다. 00000000, 00000001, …, 111111111 : 256개 = 2^8이지만 00000001, 00000002, …, 11111111 : 255개 = 2^8-1 이기 때문이니까요.
9~13번 줄) 여기서는 %c로 한 자리씩 출력합니다. 반복 작업이니까 for문을 이용해서 코드를 줄일 수 있습니다.
위에서는 char배열 선언과 사용을 해봤는데, 정수와 다른 자료형 배열도 동일합니다.
2. 2차원 배열
#include <stdio.h>
int score[3][2]; //3명의 학생들의 2과목 성적을 체크
int total[2], a, b;
int main(){
for (b = 0; b < 3; b++){ //점수 입력받음
printf("%d번 학생의 국어, 수학점수: ", b+1);
scanf("%d %d", &score[b][0], &score[b][1]);
}
for (a = 0; a < 3; a++){ //총점계산
total[0] += score[a][0];
total[1] += score[a][1];
}
printf("\n3명의 국어 총점:%d", total[0]);
printf("\n3명의 수학 총점:%d", total[1]);
}
3번 줄) 2차원 배열을 선언했습니다.
선언은 행-열 순으로 int a[3][2]라고 선언했다면
0 0
0 0
0 0
형태로 배열이 만들어집니다.
3~4번 줄) #include 아래서 함수 시작 전 선언하는 변수를 전역 변수라고 합니다. 배열을 전역 변수로 선언하면 초깃값을 지정하지 않았어도 0으로 초기화됩니다. 이 코드에서는 초기화를 따로 하지 않았지만 score와 total 배열의 값이 0으로 초기화가 되었습니다. 변수는 따로 초기화를 해줘야 합니다.
12~14번 줄) 2차원 배열은 1차원 배열이 여러 개 있다고 생각하고 사용하면 됩니다.
참고
전역 변수는 편리하긴 하지만 모든 변수를 전역 변수로 선언하는 것은 좋은 방법이 아닙니다. 전역 변수를 무분별하게 사용한다면 나중에 프로그램이 커졌을 때, 어떤 함수가 전역 변수의 값을 변경 시키는지 헷갈리게 되어 유지보수가 힘들어집니다. 지역 변수와 전역 변수의 이름이 겹치는 가능성도 생깁니다.
3. 배열 초기화
배열을 선언하고 초기화를 하지 않으면, 배열의 메모리 자체에 있는 쓰레기 값을 출력하기 때문에 초기화를 꼭 해야 합니다. 배열을 초기화 하기 위해서는 다음과 같은 방법들이 있습니다.
//1차원
char a[3] = "Hello"; //문자형 초기화
char a[] = "Hello"; //문자형 동적할당
int a[3] = {1, 2, 3}; //배열 요소를 각각 1, 2, 3으로 초기화
int a[] = {1, 2, 3}; //정수형 동적할당
int a[3] = {0, }; //모든 배열 요소를 0으로 초기화
int a[3] = {1, 2, }; // a[0]과 a[1]은 각각 1, 2로 나머지는 0으로 초기화
int a[3]; //초기화 하지 않음
//2차원
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //1 2 3 4 5 6 7 8 9로 초기화
int a[3][3] = {0, }; //모든 배열 요소를 0으로 초기화
int a[3][3] = {{1, }, {2, }}; //a[0][0]은 1, a[0][3]은 2, 나머지는 0으로 초기화
int a[3][3]= {1, 2,;} //a[0][0]은 1, a[0][1]은 2, 나머지는 0으로 초기화
//3차원
int a[3][2][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}; //초기화
int a[3][2][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9},{10, 11, 12},{13, 14, 15},{16, 17, 18}}; //초기화
int a[3][2][3] = {0, }; //모든 배열 요소 0으로 초기화
추천문제
https://www.acmicpc.net/problem/8958
https://www.acmicpc.net/problem/2920
https://www.acmicpc.net/problem/10039
https://www.acmicpc.net/problem/2577
https://www.acmicpc.net/problem/2167
'알고리즘 > Algorithm' 카테고리의 다른 글
알고리즘-수학1 (0) | 2019.07.06 |
---|---|
std::sort 정렬 기준 바꾸기 (1) | 2019.05.12 |
탐욕 알고리즘(greedy algorithm) (2) | 2019.05.09 |
C언어 알고리즘-정수, 실수, 문자/문자열 입출력 (0) | 2019.05.04 |
완전 탐색(Brute Force) (2) | 2019.05.04 |