본문 바로가기
C Programming/연습 문제

[C언어 연습문제]강좌 11. Array Reversal(배열 반전, 요소 뒤집어 출력)

by 희품 2019. 3. 22.
반응형


학습(Study) & 목표(Objective) & 과제(Task)

크기 n의 배열을 역순으로 만들어 봅시다.

예제

배열 arr

arr = [1, 2, 3, 4, 5]

반전된 배열

arr = [5, 4, 3, 2, 1]


입력 형식(Input Format)

첫 줄에 배열의 크기를 나타내는 정수 n이 표시됩니다. (입력)

다음 줄에는 n개의 공백으로 구분된 정수 배열의 요소가 표시 됩니다.


제약 조건(Constraints)

i는 배열의 요소(index)

출력 형식(Output Format)

출력은 배열을 인쇄할 편집기에서 주어진 코드로 출력합니다.

주어진 배열을 역순으로 표시하면 됩니다.


입력 예제(Sample Input) - 1

6

16 13 7 2 1 12


참고 : 배열 arr = [16, 13, 7, 2, 1, 12]


출력 예제(Sample Output) - 1

12 1 2 7 13 16


참고 : 변경된 배열 arr = [12, 1, 2, 7, 13, 16]


입력 예제(Sample Input) - 2

7

1 13 15 20 12 13 2


출력 예제(Sample Output) - 2

2 13 12 20 15 13 1


입력 예제(Sample Input) - 3

8

15 5 16 15 17 11 5 11


출력 예제(Sample Output) - 3

11 5 11 17 15 16 5 15


주어진 코드

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int num, *arr, i;
    scanf("%d"&num);
    arr = (int*malloc(num * sizeof(int));
    for(i = 0; i < num; i++) {
        scanf("%d", arr + i);
    }
 
 
    /* Write the logic to reverse the array. */
 
    for(i = 0; i < num; i++)
        printf("%d "*(arr + i));

    return 0;
}

동적으로 배열을 생성하고, 데이터를 입력받았으며, 다시 데이터를 출력하는 것까지 코드가 제공됩니다.


답안 코드

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int num, *arr, i;
    scanf("%d"&num);
    arr = (int*malloc(num * sizeof(int));
    for(i = 0; i < num; i++) {
        scanf("%d", arr + i);
    }
    /* Write the logic to reverse the array. */ 
    int* left_ptr = arr;
    int* right_ptr;
    int temp;
    for(i = 0; i < num; i++) {
        if(i == num - 1) {
            right_ptr = (arr + i);
        }
    }
    while(left_ptr < right_ptr) {
        temp = *right_ptr;
        *right_ptr = *left_ptr;
        *left_ptr = temp;
        right_ptr--;
        left_ptr++;
    }
      
    for(i = 0; i < num; i++) {
        printf("%d "*(arr + i));
    }
    free(arr);
    return 0;
}

위의 코드를 봅시다. 포인터를 통해 좌우를 바꾸는 방법을 사용한 것 같네요. 처음 배열 주소(left_ptr)와 마지막 배열 주소(right_ptr)를 찾아서 저장하고, 왼쪽은 한 칸씩 오른쪽으로, 오른쪽은 한 칸씩 왼쪽으로 오면서 순서를 바꿔주는 방법을 사용하였습니다. 이론상으로는 정확한 로직일 수 있겠네요.


해결된 코드

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int temp = 0, num = 0, i = 0;
    int nLastIdx = 0;
    int *arr = NULL;
 
    //== 배열 크기 입력 ==//
    scanf("%d"&num);
    nLastIdx = num  - 1;
 
    // 배열 생성 및 요소 입력 ==//
    arr = (int*malloc(num * sizeof(int));
    for(i = 0; i < num; i++)
    {
        scanf("%d"&arr[i]);
    }
 
    //== 배열 반전 ==//
    for(i = 0; i < (num / 2); i++)
    {
        temp = arr[i];
        arr[i] = arr[nLastIdx - i];
        arr[nLastIdx - i] = temp;
    }
 
    //== 배열 출력 ==//
    for(i = 0; i < num; i++)
    {
        printf("%d ", arr[i]);
    }
 
    //== 메모리 해제 ==//
    if(arr) { free(arr); arr = NULL; }
 
    return 0;
}

조금 직관적인 방법을 사용해봤습니다. 바로, 왼쪽과 오른쪽을 교환해주는 방법입니다. 사람 눈이라는 게, 왠지 대괄호를 쓰니까, 포인터보다 쉬워 보이지 않나요? 가독성도 중요하다는 점에 주목해봤습니다.



반응형