🔴 문제
문제 설명
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요.
예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
제한 사항
s는 길이 1 이상, 길이 8 이하인 문자열입니다.
s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예
s return "a234" false "1234" true
🔵 풀이
조건 1. 문자열 s의 길이가 4 또는 6인지?
조건 2. 문자열 s가 숫자인지?
조건이 두 개이고, 결과값의 데이터 타입이 Bool형이므로
return 조건 1 && 조건 2
이렇게 깔끔하게 한 줄로 코딩하고 싶었다!!!
조건 1은 s.count == 4 || s.count == 6 이렇게 가능한데,
조건 2는 한줄로 작성하기가 어려웠다.
대신, Int(_:)로 감싸서 결과값을 확인하는 방법이 떠올랐다.
** Int()로 감쌌을 때 Optional(숫자)가 반환되면 숫자, nil이 반환되면 문자
그래서 짠 코드는 다음과 같다.
func solution(_ s:String) -> Bool {
// 조건 1 - 글자수 확인
guard s.count == 4 || s.count == 6 else {
return false // 글자 수가 4 또는 6이 아닌 경우 false 반환
}
// 조건 2 - 숫자인지 확인
// -> Optional Blinding으로 nil을 거를 수 있음
if let sInt = Int(String(s)) {
return true // nil이 아닌 경우 true 반환
}
return false // nil인 경우 flase 반환
}
➕ 코드 보완 a
그런데 이 코드를 더 간단하게 줄일 수 있다.
조건 1과 2를 모두 만족하는 경우만 true이므로,
if문을 중복 사용하여 다음과 같이 만들 수도 있다.
func solution(_ s:String) -> Bool {
if s.count == 4 || s.count == 6 {
if let sInt = Int(String(s)) {
return true
}
}
return false
}
➕ 코드 보완 b
그런데 여기서 Optional Blinding을 굳이 할 필요가 없다!
➕ 한 줄로!
다른 풀이를 보니, 한 줄로도 코딩이 가능한 걸 알 수 있었다.
func solution(_ s:String) -> Bool {
return (Int(s) != nil && (s.count == 4 || s.count == 6)) ? true : false
}
이 코드를 보고 solution 함수에 한 자리 문자를 넣었을 때 오류가 발생하면 어쩌나 싶었는데
**(Int(_:)에 String이 아닌 Character를 집어 넣을 경우, 오류가 발생함)
다시 생각해보니, 함수를 정의할 때 s를 스트링이라고 정의해서 괜찮을 것으로 보인다.
'Swift > Code Kata (알고리즘)' 카테고리의 다른 글
[Swift|코드카타] (프로그래머스) #38. 직사각형 별찍기 - readLine(), components(seperatedBy:) (0) | 2024.03.12 |
---|---|
[Swift|코드카타] (프로그래머스) #37. 행렬의 덧셈 (0) | 2024.03.11 |
[Swift|코드카타] (프로그래머스) #34. 문자열 내림차순으로 배치하기 - sorted()는 배열을 반환한다 (0) | 2024.03.07 |
[Swift|코드카타] (프로그래머스) #33. 약수의 개수와 덧셈 - 약수는 제곱근으로! (0) | 2024.03.06 |
[Swift|코드카타] (프로그래머스) 입문 #32. 내적 - 시퀀스 쌍 만드는 zip(_:_:), map, reduce (0) | 2024.03.05 |