C프로그래밍 (K&R, Ch4, Exercise4-13, reverse)

Copyright (c) 2015-, All Rights Reserved by Kwanghoon Choi
(아래 강의 노트를 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.)

The C Programming Language 2nd Ed. by Kerninghan & Ritchie ( Ch.4, reverse )

문자열을 뒤집는 reverse 함수를 재귀함수로 작성해보자. 단, 이 함수의 인자로 주어진 문자열 s가 차지하는 공간 만을 사용하되 별도의 배열을 사용하지 않는다. ("in place" 버전의 reverse 함수를 작성)

함수 원형
  void reverse(char s[]);

reverse 함수 사용 예:
  char str[100];
  strcpy(str, "Yonsei University");

  printf("[%s] => ", str);
  reverse(str);
  printf("[%s] \n", str);

실행 결과:
  [Yonsei University] => [ytisrevinU iesnoY] 

기본적인 아이디어는 함수 reverse는 길이가 0인 빈 문자열 ""에 적용하거나 길이가 1인 문자열에 적용하면 그 결과는 인자로 주어진 문자열과 동일하다. 길이가 2이상인 문자열에 적용하면 이 함수의 인자로 주어진 문자열을 첫번째 문자 c와 그 이후의 문자열 therest로 분리할 수 있다. therest 문자열(s의 두번째 문자부터 그 이후의 문자열)을 reverse 함수를 재귀호출해서 뒤집은 다음, 그 결과 문자열을 왼쪽으로 한 칸씩 이동시킨다. 마지막으로 원래 첫번째 문자 c를 문자열의 맨 마지막 위치로 이동시킨다.

이 아이디어를 사용한 코드는 다음과 같다.

void reverse(char s[]) {
 int i;
 int len = strlen(s);

 if (len == 0) return;
 else if (len == 1) return;
 else { // len > 1
     char s0 = s[0];
     reverse(&s[1]);

     // shift s[1]~s[len-1] to s[0]~s[len-2]
     for(i=1; i<len; i++) {
       s[i-1] = s[i];
     }

     // copy s0 to s[len-1]
     s[len-1] = s0;
  }
}

아래의 main 함수를 사용해서 재귀함수 reverse를 테스트해보자.

#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void reverse(char s[]);

char tests[][MAX_LEN] = {
 "abc",
 "",
 "Republic of Korea",
 "Yonsei University"
};

int main() {
 char str[MAX_LEN];
 int i;

 for(i=0; i<sizeof(tests)/MAX_LEN; i++) {
    strcpy(str, tests[i]);

    printf("[%s] => ", str);
    reverse(str);
    printf("[%s] \n", str);
 }

 return 0;
}

[끝]

Leave a Reply

Your email address will not be published. Required fields are marked *