알고리즘/고군분투

LeetCode August3.Valid Palindrome

언클린 2020. 8. 6. 09:53
728x90

1. 문제(원본)

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:

Input: "A man, a plan, a canal: Panama"

Output: true

Example 2:

Input: "race a car"

Output: false

 

Constraints:

  • s consists only of printable ASCII characters.

2. 문제

팰린드롬 문제를 풀어라 단 알파벳과 숫자만을 비교

3. 나의 답

class Solution {

    func isPalindrome(_ s: String) -> Bool {

        let regex = try? NSRegularExpression(pattern: "[a-z0-9]", options: .caseInsensitive)

        let nsS = s as NSString

        let formatString = regex?.matches(in: s, options: [], range: NSRange(location: 0, length: nsS.length)).map {

            nsS.substring(with: $0.range)

        }

        

        guard let target = formatString else {

            print("error")

            return false

        }

        

        for index in 0..<target.count / 2 {

            print(target[index] + " : " + target[(target.count - 1) - index])

            if target[index].uppercased() != target[(target.count - 1) - index].uppercased() { return false }

        }

        return true

    }

}

4. 다른 유저의 답

#1

class Solution {

    func isPalindrome(_ s: String) -> Bool {

        var sArray = [String]()

        let letters = CharacterSet.letters

        let decimals = CharacterSet.decimalDigits

        for char in s {

            if char.isNumber || char.isLetter {

                sArray.append(char.lowercased())

            }

        }

 

        let lastIndex = sArray.count - 1

        for i in 0..<sArray.count/2 {

            if sArray[i] != sArray[lastIndex - i] { return false }

        }

 

        return true

    }

}

5. 마무리

이번 문제는 CharacterSet의 존재를 모르고 풀었기 때문에 어떻게 풀어야 하나 비교하기 쉽게 비교 배열을 만들어 작성하려고 했는데 내친김에 타 블로그에서 보았던 정규표현식 방법으로 어떻게든 풀어보자라는 생각이 들었다. 익숙해지기 위해서는 사용해보는 방법이 가장 좋다고 생각하기 때문에 사용해보았는데 의외로 잘 풀려서 기분은 좋았다. 

그리고 패턴도 어떤 식인지 몇 가지 테스트도 해보았는데 아래와 같은 결과로 출력되었다. 자주 활용하는 습관을 들여야겠다.

  • [a-z0-9]  하나씩 출력되었다. ["A", "B", "C", "D", "E", "F" ...]
  • ^[a-z0-9] 맨 앞 글자만 출력되었다. ["A"]
  • [a-z0-9]+ 단어로 묶여 출력되었다. ["ABC", "DEF" ...]
728x90

'알고리즘 > 고군분투' 카테고리의 다른 글

LeetCode706. Design HashMap  (0) 2020.04.20
LeetCode206. Reverse Linked List  (0) 2020.04.14
LeetCode888. Fair Candy Swap  (0) 2020.04.12