i0nucleus.egloos.com

ZeroNucleus - Programmer


Twitter_FM

All_Blog_AD

English

Yahoo Blog Rank

야후 블로그 벳지


[C] 문자열 뒤집기

블로그 돌아다니다가 "문자열 뒤집기" 대한 주제가 여기저기 있어서 한번 풀어보았다.
자세히는 모르겠습니다만. 저도 한번 풀어보았습니다.

[관련 글]
http://lohengrin.egloos.com/1907690 (우리나라의 컴공 교육에 대한 생각이 들게 하는 면접)
http://lesstopia.egloos.com/4953124 (문자열 뒤집기가 주는 의의)

문자열 뒤집기 문제는 아래와 같습니다. 2가지 방법으로 풀이하였습니다.
첫번째 방법은 일반적으로 무난하게 풀어내는 방법이구요. 두번째 방법은 동적스택을 구현하여 풀어보았습니다. 다른 방법으로도 접근을 해보았습니다. 두 방법 모두 문자열 크기에 상관없이 동작하게 만들었습니다.


[문제]  문자열 뒤집기.
   :
int main()
{
     char str[] = "abcde";
     reverse(str);
     printf("%s\n", str);
     return 0;
}

void reverse(char* str)
{
     /// 구현하시오
}
   :

결과
edcba


아래 코드[Source Code 1]은 일반적으로 풀어내는 방법입니다. (swap)

[Source Code 1]
#include <stdio.h>

void reverse(char *str);

void main(void)
{
    char main_str[] = "ABCDEF123";

    printf("%s\n", main_str);
    reverse(main_str);
    printf("%s\n", main_str);
}

void reverse(char *str)
{
    unsigned int i, j = 0;
    char temp;                                   // 임시변수

    while(*(str+j)) j++;                         // strlen() 안쓰기 위해서 직접 NULL 체크하면서 j에 증가 (j는 문자수)
                                                  
    for(i=0, j-=1; i < j; i++, j--)              // str[i], str[j] 교환,  (비교적 쉽게 이해할 수 있습니다.)
    {
        temp = *(str+i);                         // swap
        *(str+i) = *(str+j);
        *(str+j) = temp;
    }                                                 // for(i=0, j-=1; i<j; i++, j--) *(str+i) ^= *(str+j) ^= *(str+i) ^= *(str+j);  이것도 가능함.
}

[Result 1]
ABCDEF123
321FEDCBA
계속하려면 아무 키나 누르십시오 . . .



다른 각도로 접근을 해보았습니다.
스택구조를 사용하여 문자열 뒤집기를 하는 방법입니다.  여기서 스택은 동적할당 스택을 구현하였습니다.
[Source Code 1]보다는 코드량이 많아집니다. 스택을 구현이 있어서요.
스택 개념을 사용하면, void reverse(char *str); 함수에서 코드량은 줄일 수 있습니다.

[Source Code 2]
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef char Stack_valtype;                     // Variable Type
Stack_valtype *STACK = NULL;                   // Array 
int Stack_Top = -1, Stack_Capacity = 1;        // Stack TOP, Capacity.

void reverse(char *str);

int StackFull()
{
    STACK = (Stack_valtype *)realloc(STACK, 2 * Stack_Capacity * sizeof(Stack_valtype));
    if(STACK == NULL)                            // 에러 처리.. exit()함수 사용해도 됨.
    {
        printf("Memory Error!!!\n");
        return -1;                             //exit(1);                           
    }
    Stack_Capacity *= 2;                         // 용량의 2배...
    return 0;
}

void push(Stack_valtype item)
{
    if(Stack_Top >= Stack_Capacity-1)
        if(StackFull() == -1) return;  //exit(1);
    *(STACK+(++Stack_Top)) = item;
}

Stack_valtype pop(void)
{
    if(Stack_Top <= -1)
    {
        printf("The stack is empty. Return_Value is 0(zero).\n");
        return 0; //exit(1);
    }
    return *(STACK+(Stack_Top--));
}
/* Coded by i0nucleus */
int main(void)
{  
    char main_str[] = "ABCDEF123";
  
    STACK = (Stack_valtype *)malloc(Stack_Capacity * sizeof(Stack_valtype));

    printf("%s\n", main_str);
    reverse(main_str);
    printf("%s\n", main_str);
   
    free(STACK);
    return 0;
}

void reverse(char *str)      //---------------------
{
    char *temp = str;

    while(*temp) push(*temp++);
    while(*str) *(str++) = pop();   
}

[Result 2]
ABCDEF123
321FEDCBA
계속하려면 아무 키나 누르십시오 . . .