C언어 array 원소 존재 여부, 인덱스 번호 탐색 예제
C언어에서 배열 내에 특정 원소가 포함되어 있는지 여부를 탐색하거나
값이 들어있는 위치의 인덱스 번호를 가져오는 방법의 예시를 다루어 보겠습니다.
배열 안에 값이 포함되어 있는지 여부 반환
C언어에서 배열 내에 특정 원소가 들어있는지에 대한 정보를 확인하기 위해서는
배열, 배열 크기 그리고 찾기를 원하는 값을 input으로 받은 뒤,
for문을 통해서 값 일치 여부를 일일이 확인하는 식으로 구현해야 합니다.
정수 배열 arr에 대하여 val 값의 여부를 찾는 isin 함수의 구현 예시는 다음과 같습니다.
// input : 배열 arr, 배열 크기 size 그리고 찾을 값 val
int isin(int* arr, int size, int val){
// 배열 원소를 차례대로 순회하면서 val 값과 일치 여부 검사
for(int i = 0; i < size; i++){
if(arr[i] == val) return 1; // 있으면 1 반환
}
return 0; // 배열 원소들을 전부 확인 후 없으면 0 반환
}
중간에 val과 일치하는 값이 존재하면 1이 반환되며 바로 종료되고
배열의 모든 값들을 전부 확인해도 val과 같은 값이 없으면 0이 반환됩니다.
주의할 점은 배열 크기를 미리 input으로 주시는 것이 구현에 유리하다는 점입니다.
포인터 자료형으로 함수에 배열 input을 주게 되면 배열의 크기를 찾는 과정에서
포인터에 대한 sizeof 함수의 결과가 8로 고정되어 배열 사이즈 추적이 어려워질 수 있습니다.
위에서 구현한 isin 함수를 통하여 배열 내에 값 포함 여부를 추적한 예시는 아래와 같습니다.
#include <stdio.h>
int main()
{
int a[] = {3, 8, 2, 9, 7}; // 배열 선언
int size_a = sizeof(a) / sizeof(int);
int is_1 = isin(a, size_a, 1); // 1이 있는지 검사
int is_7 = isin(a, size_a, 7); // 7이 있는지 검사
printf("1이 배열에 있는지 여부 : %d\n", is_1); // 0
printf("7이 배열에 있는지 여부 : %d\n", is_7); // 1
}
1과 7의 배열 내 포함 여부를 조사해본 결과로 각각 0과 1이 반환된 점을 볼 수 있었습니다.
정수 배열이 아니라 다른 자료형 배열인 경우도 비슷한 원리로 구현을 해주시면 됩니다.
배열 내의 원소 위치 인덱스 반환
이번에는 단순히 배열 내에 원소가 있다/없다 여부 뿐 아니라
원소가 포함된 배열 내의 위치 인덱스 값을 가져오는 함수를 구현해 보겠습니다.
위의 isin 함수와 전반적인 구성은 거의 같으나,
존재하는 경우는 해당 위치의 인덱스, 없는 경우는 -1을 반환한다는 점이 다릅니다.
아래의 index_arr 함수 구현 예시 코드를 살펴보시면서 위의 isin 함수와 비교해보세요.
(참고1 : 문자열(char 배열)의 경우에는 index 함수가 따로 존재합니다.)
(참고2 : 아래의 구현 방식에서는 값이 여러 개 존재하는 경우에 가장 앞의 인덱스를 반환합니다.)
// input : 배열 arr, 배열 크기 size 그리고 찾을 값 val
int index_arr(int* arr, int size, int val){
// 배열 원소를 차례대로 순회하면서 val 값과 일치 여부 검사
for(int i = 0; i < size; i++){
if(arr[i] == val) return i; // 있으면 인덱스 위치 반환
}
return -1; // 배열 원소들을 전부 확인 후 없으면 -1 반환
}
마찬가지로 실제 배열에 대하여 위의 index_arr 함수로 인덱스 번호를 추적하는
예제 코드를 구현한 결과는 다음과 같습니다.
#include <stdio.h>
int main()
{
int a[] = {3, 8, 2, 9, 7}; // 배열 선언
int size_a = sizeof(a) / sizeof(int);
int idx_1 = index_arr(a, size_a, 1); // 1의 위치 검사
int idx_7 = index_arr(a, size_a, 7); // 7의 위치 검사
printf("1이 배열에 있는지 여부 : %d\n", idx_1); // -1
printf("7이 배열에 있는지 여부 : %d\n", idx_7); // 4
}
포함되지 않은 값의 경우에는 -1이 반환된 반면,
포함된 값의 경우에는 해당 위치의 인덱스 숫자가 반환된 점을 확인해볼 수 있었습니다.
'C & C++' 카테고리의 다른 글
[C언어] 배열, 문자열 슬라이싱 구현 예제 (1) | 2022.09.23 |
---|---|
[C언어/C++] n제곱, n제곱근 구하기 방법 : pow() 함수 (0) | 2022.07.06 |
[C++] 문자열 string vs char 배열 선언 방식 비교 (0) | 2022.06.13 |