[프로그래머스] 가장 긴 펠린드롬 | kotlin - 미해결

2025. 1. 19. 21:17·학습 기록/문제풀이
반응형

문제 설명

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

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

 

제한사항

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

풀이

class Solution {
    fun solution(s: String): Int {
        var answer = 1
        for (i in s.indices) {
            var subS = s.substring(i..s.length-1)
            if(subS.length < answer) break
            while(subS.length>0){
                val length = subS.length
                if(subS[0] == subS[length-1]){
                    if(subS == subS.reversed()){
                        answer = maxOf(answer, length)
                        break
                    }
                }
                subS = subS.dropLast(1)
            }
        }
        return answer
    }
}

효율성 1번만 시간초과가 나서 머리 쥐어 뜯다가..

아니 사실 substring, reversed를 쓰는 게 비효율 적이라는 생각은 들었지만 이걸 어찌해야할지 고민이 많았다.

길이가 긴 문자열 부터 비교를 하는게 맞다고 생각을 했고 bfs를 적용하면 쉽게 풀리지 않을 까 생각했다.

class Solution {
    fun solution(s: String): Int {
        var answer = 1
        val que = ArrayDeque<String>()
        que.addLast(s)

        while (que.isNotEmpty()) {
            val temp = que
            for(i in temp.indices){
                val value = que.removeFirst()

                if (palindrome(value)) {
                    return value.length
                }
                if (value.length > 2) {
                    que.addLast(value.dropLast(1))
                    que.addLast(value.drop(1))
                }
            }
        }
        return answer
    }

    fun palindrome(s: String): Boolean {
        var start = 0
        var end = s.length - 1
        for (i in 1..s.length / 2) {
            if (s[start] != s[end]) return false
            start++
            end--
        }
        return true
    }
}

하지만 while문이 돌아가면서 큐에는 2^n 개의 문자열이 쌓이고.. 메모리 초과가 떠버렸다...ㅜㅜ

bfs 생각하고 기가막히다는 생각이 들었는데 막상 코드를 짜보니 메모리 측면에서 매우매우 비효율 적인 코드가 완성이 되어버렸다......

 

결국 못참고 다른 사람의 풀이를 봐버렸는데 이걸 왜 생각을 못했지라는 생각이 들면서

지금 이대로 풀어버리면 그냥 베낀 코드가 되버릴것 같아서 나중에 다시 풀기로 결정했다..

 

화가난다 화가나

 

문제 링크

반응형

'학습 기록 > 문제풀이' 카테고리의 다른 글

[소프티어] 나무섭지 | kotlin  (0) 2025.02.02
[소프티어] 순서대로 방문하기(HSAT 7회 정기 코딩 인증평가 기출) | kotlin  (0) 2025.01.29
[프로그래머스] 가장 먼 노드 | kotlin  (0) 2025.01.19
[프로그래머스] 겹치는 선분의 길이 | kotlin  (0) 2025.01.16
[프로그래머스] 여행 경로 | kotlin  (0) 2025.01.16
'학습 기록/문제풀이' 카테고리의 다른 글
  • [소프티어] 나무섭지 | kotlin
  • [소프티어] 순서대로 방문하기(HSAT 7회 정기 코딩 인증평가 기출) | kotlin
  • [프로그래머스] 가장 먼 노드 | kotlin
  • [프로그래머스] 겹치는 선분의 길이 | kotlin
BaekCCI
BaekCCI
  • BaekCCI
    BaekLog
    BaekCCI
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 학습 기록
        • 안드로이드
        • 문제풀이
        • kotlin
      • 우아한 테크코스
      • 백씨의 하루
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    우아한테크코스
    Java
    소프티어
    i/o extended android
    softeer
    프로그래머스
    백준
    androiddeveloper
    Android
    우테코
    Algorithm
    Kotlin
    코틀린
    gdg korea
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.6
BaekCCI
[프로그래머스] 가장 긴 펠린드롬 | kotlin - 미해결
상단으로

티스토리툴바