본문 바로가기

카테고리 없음

[C언어] 회문(Palindrome)판별 - 설계 및 구현

void main()
{
	char str[10], i;

	while(1)
	{
		printf("단어를 입력해 주세요 : ");
		scanf("%s", str);
		if(strcmp(str, "exit") == 0)break;

		for(i = 0; i < strlen(str); i++)
		{
			if(!(((str[i] >= 'a') && (str[i] <= 'z')) 
				|| ((str[i] >= 'A') && (str[i] <= 'Z')))) break;
		}
		if(i != strlen(str))
		{
			printf("잘못된 값을 입력하셨습니다. \n\n");
			for(i = 0; i < 10; i++)str[i] = NULL;
			continue;
		}

		for(i = 0; i < (strlen(str) / 2); i++)
		{
			if(str[i] != str[strlen(str) - i - 1])break;
		}
		if(i == (strlen(str) / 2))printf("회문입니다.\n");
		else printf("회문이 아닙니다.\n");
		printf("\n");
		for(i = 0; i < 10; i++)str[i] = NULL;
	}
}

프로그램이 살짝 길다. 변수선언은 두 개 밖에 없다. 문자열을 받기 위한 str[10], 반복문을 실행하기 위해서 i가 전부이다. 우선 scanf()를 통해서 문자열을 입력받는다. 문자열을 입력받은 후 가장 먼저 해야하는 것이 프로그램을 종료하라는 명령어인가를 가장 먼저 검사한다.


'exit'를 입력했는데 '회문이 아닙니다.' 라는 메시지가 나오고 종료가 되지 않으면 요구사항에 맞지 않기 때문이다. 아! strcmp()함수는 문자열을 비교하는 함수이다. 두 문자열이 같다면 0, 다르다면 -1 또는 1을 반환한다.


strcmp(s1, s2)라고 했을 때 s1이 더 크다면 1을 반환하고 작다면 -1을 반환한다. 그 후에 입력값에 오류여부를 검사한다. 영어단어만을 입력해야 하므로 숫자, 특수문자, 한글 등 다른 것을 입력하면 안된다. 그래서 영어 소문자 범위에 포함되던지 영어 대문자 범위에 포함되는가를 검사했다.


입력된 값에 오류가 있다면 프로그램 처음으로 되돌아가는 것은 똑같지만 여기서는 continue;와 str[]배열의 값을 초기화 시켜 주었다. 굳이 goto문을 쓰지 않아도 되는 상황이고 배열에 다른 값이 들어가  있다면 다음 입력되는 문자열의 길이가 더 짧을 경우 뜻하지 않게 프로그램이 돌아가기 때문이다.


변수의 초기화는 항상 중요하다. 이제 회문(Palindrome)인지 아닌지만 판별하면 된다. 입력받은 문자열의 제일 처음 문자와 끝문자를 비교한다. 그리고 두 번째 문자와 끝 바로앞 문자, 이렇게 계속 비교해 나가면서 다른 값이 없다면 회문(Palindrome)이고 다른 값이 있었다면 회문(Palindrome)이 아닌 것이다.