Daily LeetCode Challenge - 2131. Longest Palindrome by Concatenating Two Letter Words

Min Young Kim·2022년 11월 3일
0

algorithm

목록 보기
24/198

Problem From.

https://leetcode.com/problems/longest-palindrome-by-concatenating-two-letter-words/

오늘 문제는 주어진 배열에서 단어들을 이어붙여서 가장 긴 palindrome (앞으로 읽어도 거꾸로 읽어도 같은 단어) 를 만드는 문제였다.

처음에는 이중 for 문을 사용하여 모든 원소들을 하나씩 비교하려고 하였지만 그렇게 하면 실행시간이 너무 길어지고 복잡해지기 때문에 HashMap 을 사용하였다.

리스트를 처음부터 검사하면서, 중복되는 값이 없으면 map 에 넣고, 중복되는 값이 있으면 map 에서 빼면서 answer 를 4씩 증가시켜 주었다.

그리고 gg 와 같이 혼자서도 palindrome 을 이루는 단어는 가운데에 딱 한개 들어가면서 answer 의 길이를 2 늘려줄 수 있으므로, 마지막에 map 을 한번 검사하면서 넣을 수 있으면 넣어주었다.

이때 검사하는 조건은 그 key 값이 혼자서도 palindrome 이면서 answer 을 2로 나눈 값이 짝수여야 했다.

abcddcba 와 같이 8자리인 palindrome 은 2로 나누어도 그 길이의 반이 짝수 이지만,
abcdggdcba 와 같이 이미 가운데에 palindrome 인 단어가 들어가면 10인 길이를 반으로 나누면 홀수가 남기때문이다.

class Solution {
    fun longestPalindrome(words: Array<String>): Int {
        
        var answer = 0
        
        val map = HashMap<String, Int>()
        
        var hasMiddle = false
        
        words.forEach { word ->
            
            if(word.reversed() == word) hasMiddle = true
            if(map.containsKey(word.reversed())) {
                if(map.get(word.reversed())!! > 1) {
                    map.put(word.reversed(), map.get(word.reversed())!! - 1)
                }else {
                    map.remove(word.reversed())
                }
                answer += 4
            }else {
                map.put(word , map.getOrDefault(word , 0) + 1)
            }
            
        }
        
        map.forEach { entry ->
            if(hasMiddle && (answer / 2) % 2 == 0 && (entry.key.reversed() == entry.key)) answer += 2
        }
        
        
        return answer
    }
}

위와 같은 방식으로 O(N) 의 Time Complexity 를 얻을 수 있었다.

profile
길을 찾는 개발자

0개의 댓글