[401] Palindromes








Problem Link : http://acm.uva.es/p/v4/401.html








■ Problem
– 입력된 문자열이 중앙을 중심으로 자리만 대칭인지
– 아니면 중앙을 중심으로 거울처럼 반사된 형식인지 구분하는 문제

■ Solution
– 좌우대칭은 문자열 중심까지 루프돌면서 첫문자 끝문자 비교하고 하나씩 비교한다.
– 반사는 똑같이 문자열 중심까지 루프돌면서 끝문자가 첫문자의 반사된 문자인지 비교…

■ Critical Input
– 입력된 글자수가 1일경 1/2가 0이기때문에 루프도 돌지 않아서 조심해야함…
– 좌우대칭은 문제가 되지 않지만 좌우반사는 또다른 처리를 해줘야함





[ Source Code ]

#include <stdio.h>
#include <string.h>

#define PALINDROME 1
#define MIRROR 2
#define NOT 3

int palindrome ( const char * );
int mirror ( const char * );
void input_data ();

char data[91];

int main ( void )
{

char input[100];
int loop, input_len;

input_data ();

while ( gets( input ) != NULL ) {
printf ( %s, input );

// 입력에서 숫자 ‘0’을 무자 ‘O’로 모두 바꾸는 부분
input_len = strlen ( input );
for ( loop = 0 ; loop < input_len ; loop++ ) {
if ( input[loop] == ‘0’ ) input[loop] = ‘O’;
}

// palindrome 인지 mirror인지 아님 둘다인지..
// 아님 둘다아닌지 판별해서 출력하는 부분

if ( palindrome ( input ) == NOT ) {
if ( mirror ( input ) == MIRROR ) {
// Not palindrome but mirror
printf ( ” — is a mirrored string.\n\n );
}
else {
// Not palindrome and not mirror
printf ( ” — is not a palindrome.\n\n );
}
}
else {
if ( mirror ( input ) == MIRROR ) {
// palindrome and mirror
printf ( ” — is a mirrored palindrome.\n\n );
}
else {
// palindrome but not mirror
printf ( ” — is a regular palindrome.\n\n );
}
}
}

return 0;

}

void input_data ()
{
char input1[] = “1SE Z 8 “;
char input2[] = “A 3 HIL JM O 2TUVWXY5”;
int loop;

strcpy ( &data[‘1’], input1 );
strcpy ( &data[‘A’], input2 );

}

int palindrome ( const char *input )
{

int input_len, loop;

input_len = strlen ( input );

for ( loop = 0 ; loop < input_len / 2 ; loop++ ) {
if ( input[loop] != input[input_len – 1 – loop] ) {
return NOT;
}
}

return PALINDROME;

}

int mirror ( const char *input )
{

int input_len, loop;

input_len = strlen ( input );

// 입력이 한글자일때.. mirror인지 구분하는 따른 부분
if ( input_len == 1 ) {
if ( input[0] != data[input[0]] ) {
return NOT;
}
else {
return MIRROR;
}
}

for ( loop = 0 ; loop < input_len / 2 ; loop++ ) {
if ( data[input[loop]] != input[input_len – 1 – loop] ) {
return NOT;
}
}

return MIRROR;

}


   One Comment


  1. 쿠쿠
      2007-03-05

    ㅎㅎ 걸죽하게 한잔하고 와서 문제푸는 이기분 좋아~~!~! 또라이짓…
    연습장에 솔루션 적어놓고… 코딩만 했당… 간단한 문제일줄 알았는데…
    역시 예외가 좀 있군…

댓글 남기기