블로그 돌아다니다가 "문자열 뒤집기" 대한 주제가 여기저기 있어서 한번 풀어보았다.
자세히는 모르겠습니다만. 저도 한번 풀어보았습니다.
[관련 글]
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
계속하려면 아무 키나 누르십시오 . . .
자세히는 모르겠습니다만. 저도 한번 풀어보았습니다.
[관련 글]
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
계속하려면 아무 키나 누르십시오 . . .





최근 덧글