코딩/기타 정보글

[C++] 1차원, 2차원, 3차원 배열 초기화 정리(fill, fill_n,memset,전역,지역)

lee1201zxc 2024. 2. 12. 06:00
300x250

 

 

 

1차원, 2차원, 3차원 배열 초기화 하기

 

 

알고리즘 문제를 풀 때 배열을 특정 원소들로 채워 넣는 경우가 있는데요,

오늘은 C언어와 C++에서 배열 초기화 하는 여러 가지 방법을 알려드리겠습니다.

fill, fill_n, memset등에 대해 소개하겠습니다.

 

 

일단 전역변수와 지역변수에 대해 알아봅시다.

함수안에 선언된 변수를 '지역변수',

함수 밖에 선언된 변수를 '전역변수'라고 하는데

어디에 선언되냐에 따라 초기화 여부가 달라집니다.

배열도 마찬가지입니다.

 

 

 

전역변수

 

배열이 함수밖에 선언된다면 배열 안의 모든 값은 0으로 자동 초기화 됩니다.

#include<iostream>
using namespace std;
int a[5];
int main()
{
    for(int i=0; i<5; i++)
    {
        cout<<a[i]<<' ';
    }
}

위 코드를 실행시 아래처럼 모두 0으로 초기화된 것이 확인됩니다.

자동 배열 초기화

 

 

 

 

 

지역변수

 

지역변수라면 어떻게 될까요?

#include<iostream>
using namespace std;
int main()
{
    int a[5];
    for(int i=0; i<5; i++)
    {
        cout<<a[i]<<' ';
    }
}

아래와 같이 초기화되지 않아 쓰레기 값들이 들어가게 됩니다.

쓰레기값

 

 

즉 지역변수를 만들었다면 무조건 아래와 같이 초기화를 시켜줘야 합니다.

0으로 초기화

 

위 방법은 문제가 있는데 0으로만 초기화 가능합니다.

다른 숫자로 초기화 하려면 다른 방법이 필요한데

아래에서 소개하겠습니다.

 

 

1. 반복문으로 직접 배열 초기화 해주기

가장 간단한 방법입니다.

 

    int a[2][3];
    for(int i=0; i<2; i++)
    {
        for(int z=0; z<3; z++)
            a[i][z]=0;
    }

 

2차원 배열이면 2중 반복문

3차원 배열이면 3중 반복문을 이용하여 초기화해줄 수 있습니다.

가장 간단한 방법이지만 시간이 오래 걸리고 코드길이가 길다는 단점이 있습니다.

 

 

2.fill, fill_n 함수 이용하기

C++에서 가장 많이 쓰이는 방법이며 익숙해진다면 매우 편리합니다.

일단 두 함수 fill과 fill_n의 구조에 대해 알아봅시다

 

 

fill( 시작지점, 끝나는 지점, 채울 수)

fill_n( 시작하는 곳, 몇개를 채울지, 채울 수)

 

 

이를 이용하여 1차원 배열, 2차원 배열, 3차원 배열에서

어떻게 초기화를 진행하는지 보여드리겠습니다.

 

 

 

1차원 배열

a[5]를 초기화 시

 

fill_n(a,5,0)

fill(&a[0],&a[5],0)

1차원 배열 초기화

 

 

 

2차원 배열

a[2][2]를 초기화 시

 

fill_n(a[0],2*2,0)

fill(a[0],a[0]+2*2,0)

fill(a[0],a[2],0);

fill(&a[0][0],&a[1][2],0)

2차원 배열 초기화

 

 

 

3차원 배열

a[2][2][2]를 초기화 시

 

fill_n(a[0][0],2*2*2,0)

fill(a[0][0],a[0][0]+2*2*2,0);

fill(a[0][0],a[2][0],1)

fill(&a[0][0][0],&a[1][1][2],10)

3차원배열 초기화

 

 

 

위 방법들 모두 가능합니다.

추가로 0이 아닌 아무 숫자로 초기화 가능합니다.

자신의 스타일에 맞는 방법을 사용하도록 합시다.

4차원 이상의 배열들은 위를 응용하여 사용하면 됩니다.

 

 

 

2. memset 함수 이용하기

C언어에서 사용 가능하며 

<memory.h> 헤더나 <string.h> 헤더를 추가해야 사용할 수 있습니다.

 

 

memset(a,0,sizeof(int)*5);

 

 

문제는 0, -1 두 개로만 초기화가 가능합니다.

그렇기에 C언어보다는 C++에서 사용가능한 fill이나 fill_n의 사용을 

강력히 추천합니다.

 

배열 초기화는 백준 문제를 풀 때 기본이며 매우 많이 사용하게 됩니다.

그러므로 배열 초기화방법을 완벽하게 숙지하시기 바랍니다.

2차원배열 초기화는 매우 많이 필요하며

3차원배열 초기화도 가끔씩 필요합니다.

이상입니다.

 

 

 

 

728x90