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" ...]
'알고리즘 > 고군분투' 카테고리의 다른 글
LeetCode706. Design HashMap (0) | 2020.04.20 |
---|---|
LeetCode206. Reverse Linked List (0) | 2020.04.14 |
LeetCode888. Fair Candy Swap (0) | 2020.04.12 |