적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Algorithm/Programmers

[Swift 알고리즘] Programmers 문자열 다루기 기본

hongssup_ 2021. 4. 10. 11:51
반응형

문제 설명

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

 

제한 사항

- s는 길이 1 이상, 길이 8 이하인 문자열입니다.

 

내가 제출한 코드 : 최대 0.06ms

func solution(_ s:String) -> Bool {
    let c = s.count
    if c == 4 || c == 6 {
        return c == (s.filter{$0.isNumber}).count
    } else {
        return false
    }
}

filter를 사용하여 문자열에서 숫자만 가져와 비교하는 방법으로 구현했는데 다른 제출 코드를 살펴보니 더 간단한 방법이 있더라. 

애초에 String을 Int 형식으로 바꿔주면, 숫자가 아닌 문자가 들어있는 경우 결과값은 nil이 된다는 사실!!

최대 : 0.03ms

func solution(_ s:String) -> Bool {
    return (Int(s) != nil && (s.count == 4 || s.count == 6)) ? true : false
}

빠르긴 이게 제일 빠른듯. 최대 : 0.03ms, 대부분 0.02ms

무조건 짧게 적는다고 좋은건 아닌가봉가?

func solution(_ s:String) -> Bool {
    if s.count == 4 || s.count == 6 {
        return Int(s) != nil
    }
    return false
}

 

문자열이 숫자로만 이루어져있는지 아닌지 판별하는 것이 관건.

방법 1) s.count == (s.filter{$0.isNumber}).count

filter를 이용하여 문자열 내에 숫자만 뽑아, 문자열 길이를 비교

방법 2) Int(s) != nil

문자열을 Int 형식으로 바꿔주면, 숫자가 아닌 문자가 들어있는 경우 결과값은 nil

 

 

+ 제출한 코드랑 큰 차이 없는데 이렇게 써줬더니 실행시간 초과떴다. 그냥 실행할 때 마다 조금씩 다른건가? 모르겠다. 

func solution(_ s:String) -> Bool {
    if s.count == 4 || s.count == 6 {
        return s.count == (s.filter{$0.isNumber}).count ? true : false
    } else {
        return false
    }
}
728x90
반응형