Codewars(알고리즘)/7Kyu

[Codewars] [7Kyu] Highest and Lowest

Dannian 2024. 11. 30. 15:00
반응형
 

Codewars - Achieve mastery through coding practice and developer mentorship

A coding practice website for all programming levels – Join a community of over 3 million developers and improve your coding skills in over 55 programming languages!

www.codewars.com

이번 문제는 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