[Leetcode/Easy] 유효한 팰린드롬 (125. Valid Palindrome, Swift)

2024. 6. 27. 13:49Algorithm

https://leetcode.com/problems/valid-palindrome/description/

 

🤔 문제 설명

주어진 문자열이 팰린드롬이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 합니다. (영문자, 숫자가 아닌 문자는 모두 제거)

참고) 팰린드롬이란 앞뒤가 똑같은 단어나 문장으로, 뒤집어도 같은 말이 되는 단어 또는 문장을 뜻합니다.
(예시: '소주 만 병만 주소' -> 뒤집을 경우에도 '소주 만 병만 주소')

"A man, a plan, a canal: Panama"
# true ("amanaplanacanalpanama" is a palindrome.)
"race a car"
# false ("raceacar" "racaecar" is not a palindrome.)

 

💡 풀이

문제의 핵심인 "팰린드롬을 비교하는 것"은 어렵지 않을 것이라 생각했다.

Python이었다면 기존 문자열 s를 가지고 [::-1]이라는 문자열 슬라이싱 기법을 사용했으면 되었을 것이고,
Swift에서는 문자열을 reversed() 메서드를 사용해서 뒤집어주기만 하면 되기 때문이다.

단, 중요하게 생각해야 했던 것은 모든 대소문자를 구분하지 않는다는 점과 영문자와 숫자가 아닌 그 외의 다른 특수문자를 대상으로 하지 않는다는 문제의 조건이었다.
입력으로 들어온 문자열을 반복하면서 isLetter과 isNumber로 문자와 숫자인 것을 확인했고, 대소문자를 구분하지 않기 위해 lowercased 메서드를 사용해서 소문자로 모두 통일해줬다.

 

🧑🏻‍💻 코드 (by Swift)

class Solution {
    func isPalindrome(_ s: String) -> Bool {
        // 반복하면서 담을 문자열 선언
        var newString: String = ""  

        // 입력 String을 반복하면서 문자와 숫자만 남기기 + 소문자로 변환
        s.forEach {
            if ($0.isLetter || $0.isNumber) { 
                newString.append($0.lowercased()) 
            }
        }

        // 최종 팰린드롬 비교
        return newString == String(newString.reversed())
    }
}