안 쓰던 블로그

C언어 1차원, 2차원 배열 본문

알고리즘/Algorithm

C언어 1차원, 2차원 배열

proqk 2019. 5. 9. 21:36
반응형

배열

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

 

8958번: OX퀴즈

문제 "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다. "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는

www.acmicpc.net

https://www.acmicpc.net/problem/2920

 

2920번: 음계

문제 다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다. 연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을

www.acmicpc.net

https://www.acmicpc.net/problem/10039

 

10039번: 평균 점수

문제 상현이가 가르치는 아이폰 앱 개발 수업의 수강생은 원섭, 세희, 상근, 숭, 강수이다. 어제 이 수업의 기말고사가 있었고, 상현이는 지금 학생들의 기말고사 시험지를 채점하고 있다. 기말고사 점수가 40점 이상인 학생들은 그 점수 그대로 자신의 성적이 된다. 하지만, 40점 미만인 학생들은 보충학습을 듣는 조건을 수락하면 40점을 받게 된다. 보충학습은 거부할 수 없기 때문에, 40점 미만인 학생들은 항상 40점을 받게 된다. 학생 5명의 점수가 주어

www.acmicpc.net

https://www.acmicpc.net/problem/2577

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.

www.acmicpc.net

https://www.acmicpc.net/problem/2167

 

2167번: 2차원 배열의 합

첫째 줄에 배열의 크기 N, M(1 ≤ N, M ≤ 300)이 주어진다. 다음 N개의 줄에는 M개의 정수로 배열이 주어진다. 배열에 포함되어 있는 수는 절댓값이 10,000보다 작거나 같은 정수이다. 그 다음 줄에는 합을 구할 부분의 개수 K(1 ≤ K ≤ 10,000)가 주어진다. 다음 K개의 줄에는 네 개의 정수로 i, j, x, y가 주어진다(i ≤ x, j ≤ y).

www.acmicpc.net

 

반응형
Comments