코딩테스트/프로그래머스 level 3

[프로그래머스 level_3] 가장 긴 팬린드롬 for JAVA

냠냠:) 2020. 4. 24. 15:55

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 설명]

 

앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다.
문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요.

예를들면, 문자열 s가 abcdcba이면 7을 return하고 abacde이면 3을 return합니다.

제한사항

  • 문자열 s의 길이 : 2,500 이하의 자연수
  • 문자열 s는 알파벳 소문자로만 구성

입출력 예

s answer
abcdcba 7
abacde 3

입출력 예 설명

 

입출력 예 #1
4번째자리 'd'를 기준으로 문자열 s 전체가 팰린드롬이 되므로 7을 return합니다.

입출력 예 #2
2번째자리 'b'를 기준으로 aba가 팰린드롬이 되므로 3을 return합니다.

 

[풀이]

이 문제를 풀기 위해서는 몇 가지 조건이 있었다.

1. aba처럼 b를 중심으로 양쪽의 값이 같은가?

2. baab처럼 문자열의 양쪽의 값이 같은가?

3. abaaaaa abaaaaaa  a은 기준이 되는 값이다. a를 기준으로 짝수로 찾을 것인가, 홀 수로 찾을 건이가?

 

EX) aaaaa같이 양쪽 값과 바로 오른쪽 값이 같을 경우 aaaaa 이렇게 찾을지  aaaaa 이렇게 찾을지 생각해봐야 한다.

위에 세 조건을 갖춰서 답을 찾는 과정을 거치면 된다.

 

[코드] 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public int solution(String s) {
        int oddCount = 0;
        int evenCount = 0;
        if(s.length() == 1) {            //길이가 1이면 1반환
            return 1;
        }
        for(int i = 0; i < s.length()-1; i++) {
            if(i>0 && s.charAt(i-1== s.charAt(i+1)) {  //홀 수
                int left = i-1;
                int right = i+1;
                int tempcount = 0;
                while(0<= left &&  right <= s.length()-1) {    //현재 값보다 왼쪽, 오른쪽 값이 같으면
                    if(s.charAt(left) == s.charAt(right)) {
                        tempcount++;
                        left -= 1;
                        right += 1;
                    }else {
                        break;
                    }
                }
                if(oddCount< tempcount) oddCount = tempcount;
            }
            if(s.charAt(i) == s.charAt(i+1)) {            //짝 수
                int left = i;
                int right = i+1;
                int tempcount = 0;
                while(0<= left &&  right <= s.length()-1) { //현재값과 다음값이 같다면.
                    if(s.charAt(left) == s.charAt(right)) {
                        tempcount++;
                        left -= 1;
                        right += 1;
                    }else {
                        break;
                    }
                }
                if(evenCount < tempcount) evenCount = tempcount;
            }
        }
        return oddCount < evenCount ? evenCount*2 : oddCount*2 +1
    }
cs

프로그래머스 테스트 케이스 통과

느낀 점 : 처음 문제를 봤을 때 level 3 문제가 맞나 싶었다.. level 3문제 중 풀이 시간이 가장 빨랐고 어제 카카오 문제를 풀어서인지 쉽게 느껴졌다. 하지만 하다 보니 조건이 살짝? 까다로워서 몇 번 고쳐 적었다. 그리고 조금 고민하면 코드도 줄일 수 있을 것 같은데 다른 문제를 더 풀어보기 위해 최적화는 나중으로 미룬다.

 

*피드백은 언제나 환영입니다!

반응형