본문 바로가기
자료구조&알고리즘/leetcode 풀이

swift 리트코드 문제 풀기 - leetcode 유효한 팰린드롬

by 인생여희 2022. 7. 20.

swift 리트코드 문제 풀기 - leetcode 유효한 팰린드롬

 

주어진 문제

주어진 문자열이 팰린드롬인지 확인하라. 대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 한다.

 

예제1

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

Output: true

설명: "amanaplanacanalpanama" is a palindrome.

 

예제2

Input: s = "race a car"

Output: false

설명: "raceacar" is not a palindrome.

 

 

팰린드롬이란 거꾸로해도 똑같은 문자열이 되는 문자열이 되는 문장을 뜻함. 한글로 예를 들면 토마토, 기러기 같은 단어들이 있지.

주어진 문제가 대소문자를 구분하지 않고, 영문자와 숫자만을 대상으로 하는 조건이 있으니깐, 문자열 입력을 받고나서 모든 문자열을 소문자로 변환해주고, 정규식으로 숫자와 영문자만 뽑아내면 되겠네라는 생각이 들었다. 문장을 입력받는 함수를 하나만들고 이 문장이 팰린드롬이라면 true를 리턴하고, 아니면 false 를 리턴하게끔 작성했다.

 

참고로 스위프트에는 문자열을 쉽게 처리할 수 있는 내장함수들이 많다.

특정 문자를 치환할 수 있는 replacingOccurrences

문자를 소문자로 변경해주는 lowercased

등등등..

 

var inputStr = "A man, a plan, a canal: Panama"


func isPalindrome(_ inputText: String) -> Bool {
    
    //영문자와 숫자만 대상
    let pattern = "[^A-Za-z0-9]+"
    var resultString = inputText.replacingOccurrences(of: pattern, with: "", options: [.regularExpression])
    
    //소문자로 변환
    resultString = resultString.lowercased()

    //문자열 뒤집기
    var reversedStr = ""
    var length = resultString.count-1
    while 0 <= length {
        let char = resultString[resultString.index(resultString.startIndex, offsetBy: length)]
        reversedStr.append(char)
        length -= 1
    }
    
    //비교
    return resultString.elementsEqual(reversedStr)
}


print("isPalindrome : \( isPalindrome(inputStr) ) ") //true

 

돌려보면 잘나오는것을 알 수 있음. 문제는 //문자열 뒤집기 이부분임. while문을 사용해서 받은 문장의 문자열을 거꾸로 만들어 주는 코드인데, 문장이 짧으면 상관이 없는데.. 문자 개수가 10만개 정도 되면 1분 가까이 걸림... 성능이 완전 구림..

 

그래서 swift 내장함수 reversed 를 사용해서 문자열을 바로 한번에 뒤집어 줌!

 

let reversedStr = String(resultString.reversed())

 

위의 // 문자열 뒤집기 부분에 reversed 를 사용한 코드를 바꿔 넣으면 완전 빨라지는 것을 확인 할 수 있음

 

 

 

 

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