Calf+Flac

Calf Flac
It is said that if you give an infinite number of cows an infinite number of heavy-duty laptops (with very large keys), that they will ultimately produce all the world's great palindromes. Your job will be to detect these bovine beauties.

Ignore punctuation, whitespace, numbers, and case when testing for palindromes, but keep these extra characters around so that you can print them out as the answer; just consider the letters `A-Z' and `a-z'.

Find any largest palindrome in a string no more than 20,000 characters long. The largest palindrome is guaranteed to be at most 2,000 characters long before whitespace and punctuation are removed.

PROGRAM NAME: calfflac

INPUT FORMAT

A file with no more than 20,000 characters. The file has one or more lines. No line is longer than 80 characters (not counting the newline at the end).

SAMPLE INPUT (file calfflac.in)

Confucius say: Madam, I'm Adam.

OUTPUT FORMAT

The first line of the output should be the length of the longest palindrome found. The next line or lines should be the actual text of the palindrome (without any surrounding white space or punctuation but with all other characters) printed on a line (or more than one line if newlines are included in the palindromic text). If there are multiple palindromes of longest length, output the one that appears first.

SAMPLE OUTPUT (file calfflac.out)

11

Madam, I'm Adam

Source Code code format="java" /* ID: wjh3331 LANG: JAVA TASK: calfflac */

import java.io.*; import java.util.*;

public class calfflac { public static class Letter { private char ch; // 대문자 알파벳 private int index; // 입력 문장에서의 인덱스

public Letter(char ch, int index) { this.ch = Character.toUpperCase(ch); this.index = index; }

public char getCh { return ch; }

public int getIndex { return index; }

@Override public boolean equals(Object obj) { if (this.ch == ((Letter) obj).ch) { return true; }     return false; }

@Override public String toString { return ch + " " + index; } }

public static final int MAX = 20000; // 최대 입력값

public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new FileReader("calfflac.in")); PrintWriter out = new PrintWriter(new FileWriter("calfflac.out"));

// 문장 입력 char[] input = new char[MAX]; int length = in.read(input);

// 필터링된 리스트 생성 ArrayList letters = new ArrayList(length); for (int i = 0; i < length; i++) { if (Character.isLetter(input[i])) { letters.add(new Letter(input[i], i)); }   }

int startIndex = 0; // 가장 긴 회문의 처음 인덱스 int endIndex = 0; // 가장 긴 회문의 끝 인덱스

int size = letters.size; for (int i = 1; i < size; i++) { for(int j = 0; j < 2; j++) { int preBack = 0; // 현재 회문의 처음 인덱스 int preFor = 0;   // 현재 회문의 끝 인덱스

int backward = i - 1; // 뒤로 가는 포인터 int forward = i + j; // 앞으로 가는 포인터

// 회문 판단 while (backward > -1 && forward < size           && letters.get(backward).equals(letters.get(forward))) { preBack = backward; preFor = forward;

backward--; forward++; }

// 가장 긴 회문 업데이트 if (endIndex - startIndex < preFor - preBack) { endIndex = preFor; startIndex = preBack; }     }    }

// 결과 출력 out.println(endIndex - startIndex + 1); for (int i = letters.get(startIndex).getIndex; i <= letters.get( endIndex).getIndex; i++) { out.print(input[i]); }   out.println;

out.close; System.exit(0); } } code

Comment 이번 문제는 테스트 케이스들이 좀 까다로운듯 보이네요... 다른 문제들과 달리 입력시 개행문자 캐무시를 해야해서 바로 배열에 받아봤습니다. 입력받은 문장을 필터링 합니다.(영어 알파벳만 대문자로 변환해서 인덱스와 함께 리스트 구성) 처음부터 검색해보다가 회문의 느낌이 오는 녀석은 거기서부터 앞뒤로 비교를 합니다.