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으로만 초기화 가능합니다.
다른 숫자로 초기화 하려면 다른 방법이 필요한데
아래에서 소개하겠습니다.
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)
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)
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)
위 방법들 모두 가능합니다.
추가로 0이 아닌 아무 숫자로 초기화 가능합니다.
자신의 스타일에 맞는 방법을 사용하도록 합시다.
4차원 이상의 배열들은 위를 응용하여 사용하면 됩니다.
2. memset 함수 이용하기
C언어에서 사용 가능하며
<memory.h> 헤더나 <string.h> 헤더를 추가해야 사용할 수 있습니다.
memset(a,0,sizeof(int)*5);
문제는 0, -1 두 개로만 초기화가 가능합니다.
그렇기에 C언어보다는 C++에서 사용가능한 fill이나 fill_n의 사용을
강력히 추천합니다.
배열 초기화는 백준 문제를 풀 때 기본이며 매우 많이 사용하게 됩니다.
그러므로 배열 초기화방법을 완벽하게 숙지하시기 바랍니다.
2차원배열 초기화는 매우 많이 필요하며
3차원배열 초기화도 가끔씩 필요합니다.
이상입니다.
'코딩 > 기타 정보글' 카테고리의 다른 글
[C언어/C++,자바,파이썬] 온라인 컴파일러 사이트 추천 (1) | 2024.02.12 |
---|---|
[C언어/C++] 소수점 개수(자리)지정 방법 정리 (1) | 2024.02.12 |
아스키코드(ASCII Code) 정리, 활용 (1) | 2024.02.11 |
백준 Solved.ac 연동하기 (0) | 2024.02.11 |
[백준/C++] 백준 시간초과 해결법, 원인 정리 (1) | 2024.02.10 |