[프로그래머스] - 가장 긴 팰린드롬

JIWOO YUN·2023년 7월 26일
0

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/12904

구현방법

문자열 s의 길이 -> 최대 2500

문자열 s는 알파벳 소문자로만 구성됨.

2중문 돌려도 상관없다고생각됨. -> 길이가 2500이 최대기 때문에 시간이 그렇게 오래걸리지 않음.

홀수의 경우는 그대로 해도됨.

짝수의 경우 문제가 발생함.

  • 짝수의 경우 그 idx 기준으로 반으로 자른다.

간과했던점 1 -> 팰린드롬의 길이가 짝수인경우와 홀수의 경우가 대칭이 다르다.

짝수인경우 현재 index 기준부터 비교시작

홀수의 경우 현재 index에서 index -1 과 index -1 에 있는 값들을 비교해서 대칭 체크가 필요하다.

간과했던점 2

  • 홀수 짝수 팰린드롬을 둘다 체크해서 진행하지 않고 s의 길이 기준에서 짝수의 경우 짝수 팰린만, 홀수의 경우 홀수 팰린만 진행한점.
    • 굳이 이렇게 할필요가 절대 없고 현재 index기준에서 홀수 팰린과 짝수 팰린 둘다 구한다음 더 길이가 긴 것을 채용하면되었다는 점.

구현알고리즘

구현문제

CODE

class Solution
{
    public int solution(String s)
    {
        int max_len = Integer.MIN_VALUE;

            for (int idx = 0; idx < s.length(); idx++) {
                max_len = Math.max(max_len, odd_palim(s, idx));
                max_len = Math.max(max_len,even_palim(s,idx));
            }


        return max_len;
    }

    private int even_palim(String s, int idx) {
        int cnt = 0;
        if(idx == 0 || idx ==s.length()-1)
            return cnt;

        int left = idx;
        int right = idx+1;
        while(left >= 0 && right < s.length()){
            if(s.charAt(left) == s.charAt(right)){
                left-=1;
                right+=1;
                cnt+=2;
            }else{
                break;
            }
        }

        return cnt;

    }

    //팰린드롬 체크
    private int odd_palim(String s, int idx) {
        int cnt = 1;
        if(idx == 0 || idx ==s.length()-1){
            return cnt;
        }

        int left = idx -1;
        int right = idx+1;
        while(left >= 0 && right < s.length()){
            if(s.charAt(left) == s.charAt(right)){
                left-=1;
                right+=1;
                cnt+=2;
            }else{
                break;
            }
        }

        return cnt;
    }
}
profile
열심히하자

0개의 댓글