CodeWars 예순 일곱 번째 문제

Updated:

longest_palindrome

public static int longestPalindrome(final String s) {
    String original = s;
    //String original = s.replace(" ", ""); /// 1번

    for(int i = original.length(); i >= 1 ; i--) {

        for(int j = 0; j <= original.length() - i; j++) {

            if(isPalindrome(original.substring(j, j+i))){
                return i;
            }

            /*
				if(reverse.contains(original.substring(j, j+i))){ /// 2번
					return i;
				}
				*/
        }
    }

    return 0;
}

private static boolean isPalindrome(String substring) {
    String reverse = new StringBuilder(substring).reverse().toString();

    return reverse.equals(substring);
}
  • 이 문제는 처음 잘못된 접근법과 추후 다시 생각하여 올바른 접근에도 잘못된 해석으로 인하여 탈이 많았다.
  • 일단 회문을 기본적으로 물어보는 문제로서 학창시절 한 번씩 접해보는 문제다.
  • 나는 문자를 뒤집어서 기존의 문자열과 한개, 두개 비교해 나가서 가장 큰 회문을 찾으려고 했다.
  • 그러나 그것은 효율적이지 않다. greddy 알고리즘에 더 가깝게 원 문자열 크기부터 줄여나가는 방식으로 찾았다. 다시 그러나…
  • 1번의 경우 띄어쓰기에 대해서는 회문에 대하여 포함하냐 안하냐에서 나는 포함을 하지 않는 줄 알았다. 그러나 포함하더라… 해석이 잘못 되었다.
  • 2번의 경우 내가 오해를 한 것이 zabcaz의 경우 회문이 아니기 때문에 1이 나와야 한다. 그러나 2번 처럼 contain을 쓸 경우 2가 나온다. 왜냐하면 reverse를 하면 zacbaz가 나오는데 za가 겹치기 때문이다. (az는 나중에 검색되는 경우 아니 검색하기 전 이미 za에서 return되므로 경우의 수에 없다).
  • 결론적으로 2번은 아주 잘못된 접근 법이다.
  • 이렇게 겨우 문제를 해결하였다.