이 문제에서는 하나의 문자열 배열이 주어지며, 이 배열을 역순으로 뒤집는 C 프로그램을 작성하는 것이 목표입니다.
배열의 모든 요소를 반대 순서로 재배치하게 됩니다. 즉, 마지막 요소가 첫 번째 자리로 이동하고, 그 앞의 요소는 두 번째 자리로 이동하는 식으로 전체 배열이 거울상처럼 뒤집힙니다.
예시를 통해 문제를 구체적으로 살펴보겠습니다.
입력 예시
strarr[] = {"learn", "programming", "at", "tutorialspoint"}
출력 예시
strarr[] = {"tutorialspoint", "at", "programming", "learn"}
문제 해결 접근 방법
이 문제는 두 개의 인덱스(포인터)를 활용하는 대표적인 투 포인터(Two Pointer) 기법으로 해결할 수 있습니다. 하나는 배열의 시작 지점에서 출발하고, 다른 하나는 끝 지점에서 출발하여 서로 마주 보며 이동하면서 두 위치의 값을 계속 교환(swap)하는 방식입니다.
구체적인 알고리즘 동작 과정은 다음과 같습니다.
- 배열의 시작 인덱스(
start)를 0으로, 끝 인덱스(end)를 n-1로 초기화합니다. start위치의 요소와end위치의 요소를 임시 변수를 이용해 서로 맞바꿉니다.start는 한 칸 뒤로 증가시키고,end는 한 칸 앞으로 감소시킵니다.start가end보다 작은 동안 위 과정을 반복합니다.
이 알고리즘은 배열 전체를 한 바퀴의 절반만 순회하면 되므로 시간 복잡도는 O(n)이며, 별도의 추가 배열 없이 제자리(in-place)에서 처리되기 때문에 공간 복잡도는 O(1)로 매우 효율적입니다.
C 언어 구현 코드
아래는 위 알고리즘을 구현한 전체 C 코드입니다.
예제 코드
#include <stdio.h>
#include <string.h>
void ReverseStringArray(char* strarr[], int n) {
char* temp;
int end = n - 1;
for (int start = 0; start < end; start++) {
temp = strarr[start];
strarr[start] = strarr[end];
strarr[end] = temp;
end--;
}
}
int main() {
char* strarr[] = {"learn", "programming", "at", "tutorialspoint"};
int n = sizeof(strarr) / sizeof(strarr[0]);
printf("원본 배열 : ");
for (int i = 0; i < n; i++)
printf("%s ", strarr[i]);
printf("\n");
ReverseStringArray(strarr, n);
printf("뒤집힌 배열 : ");
for (int i = 0; i < n; i++)
printf("%s ", strarr[i]);
return 0;
}
실행 결과
원본 배열 : learn programming at tutorialspoint 뒤집힌 배열 : tutorialspoint at programming learn
코드 설명
ReverseStringArray 함수는 문자열 포인터 배열과 배열 크기를 매개변수로 받습니다. 함수 내부에서 임시 포인터 temp를 사용해 양쪽 끝의 문자열 포인터를 교환하며, main 함수에서는 sizeof 연산을 통해 배열의 크기를 자동으로 계산한 후 함수를 호출합니다.
여기서 중요한 점은 실제 문자열 내용 자체를 복사하거나 수정하는 것이 아니라, 각 문자열이 저장된 메모리 주소(포인터)만 서로 교환한다는 것입니다. 따라서 연산 속도가 빠르고 메모리 사용량도 최소화됩니다.