본문 바로가기

C programming/[Algorithm problem]

#1-2. 배열과 검색

728x90
반응형

배열의 전환(swap 함수)

함수를 이용한 매개변수로 배열을 사용하는 예제 코드는 다음과 같다.

#include <stdio.h>

#define Max_ele 100
#define Sentinel 0 // 종료 입력값
#define True 1
#define False 0

int GetIntArr();
int GetInt();

void PrintIntArr();
void RevPintIntArr();
void Swap();

int GetInt() {
  int ipt;
  scanf("%d", &ipt);
  return ipt;
}

int GetIntArr(int arr[], int max, int end) {
  //인자: 수정할 배열/ 배열의 최대값 / 입력 종료값
  // 배열을 입력받는 함수
  int cnt = 0, num, val;
  while (True) {

    printf("=> ");
    val = GetInt();
    if (val == end)
      break;

    arr[cnt] = val;
    cnt++;
  }

  return cnt;
}

void PrintIntArr(int arr[], int max) {
  for (int i = 0; i < max; i++)
    printf("%d\n", arr[i]);
}

void RevPintIntArr(int arr[], int num) {
  for (int i = 0; i < num / 2; i++)
    Swap(arr, i, num - i - 1);
  // (i,num-i-1) 인 이유는 반복문의 반복은 배열의 크기의 절반이고, 짝수인 경우는
  // 중간값을 바꿀 필요가 없음. 따라서 배열의 크기의 반만 반복하되 처음과 끝을
  // 순서대로 변환하면 반전시킬 수 있다.
}

void Swap(int arr[], int n, int m) {
  int cnt = arr[n];
  arr[n] = arr[m];
  arr[m] = cnt;
}

int main() {

  int arr[Max_ele], n;
  printf("임의의 정수값을 입력하세요.\n");
  printf("0을 입력하면 입력을 종료합니다.\n");
  n = GetIntArr(arr, Max_ele, Sentinel);
  RevPintIntArr(arr, n);
  PrintIntArr(arr, n);
}

일반적으로 함수를 사용하여 코드를 작성하는 것이 오류 수정이나 가독성에 있어서 장점을 가지지만 더 짧게 표현할 수 있다면 굳이 사용할 필요는 없다. 다음 코드는 위의 코드를 응용하여 짧게 표현하여 보자.

 

위의 예제코드는 배열의 한도가 정해져 있으므로 동적할당이 아닌 배열의 크기를 선언하고 Swap 할 수 있도록 코딩해 보자.

#include<stdio.h>

#define Max_ele 100
#define Sentinel 0 // 종료 입력값
#define True 1
#define False 0

int main(){
    
    int arr[Max_ele],ipt,cnt = 0;
    printf("임의의 정수값을 입력하세요.\n");
    printf("0을 입력하면 입력을 종료합니다.\n");
    while(1){

        printf("=> ");scanf("%d",&ipt); if(ipt == Sentinel) break;
        arr[cnt] = ipt; cnt++;
    }
    int *new_arr;
    new_arr = (int*)malloc((cnt)*sizeof(int));
    for(int j=0;j<cnt;j++) new_arr[j] = arr[cnt - j -1];
    
    for(int i = 0; i < cnt; i++) printf("%d\n", new_arr[i]);

}
for(int j=0;j<cnt;j++) new_arr[j] = arr[cnt - j -1];

이때 위의 표 내의 표시한 코드처럼 -1을 한 이유는 새로 동적할당한 배열에 기존의 배열을 뒤로 반복한 것을 저장해야 하는데,  cnt는 '인간의 기준'으로 배열의 인덱스 수를 센 것이기 때문에 배열이 저장돼있는 인덱스 값으로 변환하기 위해 1을 빼는 것이다. 이 부분에 주의하자.

 

위의 코드는 앞선 예제와는 다르게 동적할당을 사용했는데, 입력받은 배열의 인덱스값을 알기 때문이다. 효율적인 메모리 관리를 위해서는 동적할당한 배열을 free 선언으로 해제해야 하지만 이 정도의 메모리 소요는 미미하기 때문에 제외했다.

728x90
반응형

'C programming > [Algorithm problem]' 카테고리의 다른 글

#1-6. 포인터의 활용  (0) 2023.09.04
#1-5. 포인터 배열과 포인터 연산  (0) 2023.09.03
#1-4. 배열과 포인터  (0) 2023.09.03
#1-3. 포인터  (0) 2023.08.31
#1-1. 자료형의 크기  (0) 2023.08.30
댓글