반응형
이번 문제는 string으로 들어온 값 중 가장 큰 값과 작은 값을 찾아서 string으로 반환하는 문제입니다.
간단하게 해보자면 string을 특정 값을 기준으로 배열로 나누고, 각 배열의 아이템들을 Int로 변환 후 해당 값들의 max, min값을 찾으면 간단합니다.
다만 이걸 다 풀어서 적어보자면 다음과 같이 할 수 있겠습니다.
func highAndLow(_ numbers: String) -> String {
var highest: Int?
var lowest: Int?
for element in numbers.components(separatedBy: " ") {
guard let element = Int(element) else { continue }
if let _highest = highest {
if _highest < element {
highest = element
}
} else {
highest = element
}
if let _lowest = lowest {
if _lowest > element {
lowest = element
}
} else {
lowest = element
}
}
return "\(highest ?? 0) \(lowest ?? 0)"
}
이 동작을 따로 구현하지 않고 있는 것들로 사용하면 다음처럼 구현할 수 있겠네요.
let numArray = numbers.split(separator: " ").compactMap{ Int($0) }
return "\(numArray.max()!) \(numArray.min()!)"
데이터의 가공이 필요 없다면 가독성도 좋고 코드 사용성도 좋으니 두번째 방식으로 쓰는게 좋겠습니다.
compactMap을 쓰는 이유는 Optional Binding과 nil 제거를 위해서 사용합니다.
만약 Map을 사용한다면 반환 값은 [Int?]가 될테지만, CompactMap을 사용하면 [Int]가 반환됩니다.
flatMap또한 compactMap과 같이 optional binding 및 nil 제거가 가능하지만, Swift 4.1부터는 1차원 배열에서 nil을 제거하고 옵셔널 바인딩을 하고자 할 때 compactMap을 사용합니다.
실제로 XCode에서도 경고를 반환하니까 참고하세요.(쓸 수는 있습니다.)
반응형
'Codewars(알고리즘) > 7Kyu' 카테고리의 다른 글
[Codewars] [7Kyu] V A P O R C O D E (0) | 2024.11.30 |
---|---|
[Codewars] [7Kyu] Count the Digit (0) | 2021.03.05 |
[Codewars] [7Kyu] ToLeetSpeak (0) | 2021.03.04 |
[Codewars] [7Kyu] Sum of odd numbers (0) | 2021.03.04 |