본문 바로가기
프로그래밍

palindrome 회문

by violetoz 2013. 5. 14.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define SIZE 1005

#define NW 1

#define N 2

#define W 3

#define COMMON 4

int c[SIZE+1][SIZE+1];

int b[SIZE+1][SIZE+1];

int t[SIZE+1];

char input[SIZE+1];

char rev[SIZE+1];

int x[SIZE+1];

void makeCLS();

void traceCLS(int i,int j);

void makePalindrome();

int len;

int main()
{
 
 while(scanf("%s",input)==1)
 {
  len = strlen(input);
  memset(t,0,sizeof(int)*(len));
  memset(x,0,sizeof(int)*(len));
  makeCLS();
  printf("%d ", len - c[len][len]);
  traceCLS(len,len);
  makePalindrome();
 }
 return 0;
}
void makeCLS()
{
 int u,v,i,j;
 for(u=len-1,v=0; u >=0; u--,v++){
  rev[u] = input[v];
 }
 for( i = 1 ; i <= len ; i ++){
  c[i][0] = 0; 
  c[0][i] = 0;
 }
 for(i = 1; i <= len  ; i++){
  
  for(j = 1; j <= len  ; j++){
   if(input[i-1] == rev[j-1]){
    b[i][j] = NW;
    c[i][j] = c[i-1][j-1] + 1;
   }
   else if(c[i-1][j] > c[i][j-1]){
    c[i][j] = c[i-1][j];
    b[i][j] = N;
   }
   else{
    c[i][j] = c[i][j-1];
    b[i][j] = W;
   }
  }
 }
}
void makePalindrome()
{
 int i=0,j=0;

 while(i < len || j < len ){
  --정방향 문자 출력 --
  while(t[i] != COMMON &&  i < len){
   printf("%c",input[i]);
   i++; 
  }
  --역방향 문자 출력 --
  while(x[j] != COMMON &&  j < len){
   printf("%c",rev[j]);
   j++;
  }
  -- LCS 출력 --
  printf("%c",input[i]);
  i++; j++;
 }
 putchar('\n');
}
void traceCLS(int i,int j)
{
 int  u=0,v=0;
 
 if(i==0 || j==0)
 {
  return ;
 }
 if(b[i][j] == NW){
  -- 정방향 문자열에서 LCS 원소 체크 --
  t[i-1] = COMMON;
  -- 역방향 문자열에서 LCS 원소 체크 --
  x[j-1] = COMMON;
  traceCLS(i-1,j-1);
 }
 else if(b[i][j] == N){
  traceCLS(i-1,j);
 }
 else{
  traceCLS(i,j-1);
 }
}

'프로그래밍' 카테고리의 다른 글

BMP 구조4  (0) 2013.05.14
스마트 포인터  (0) 2013.05.14
Hexagon  (0) 2013.05.14
보간  (0) 2013.05.14
프로그램 언어의종류와 특징  (0) 2013.05.14