Neoself의 기술 블로그

알고리즘 지식 정리(10월 8일)[프로그래머스 레벨 2] 본문

개발지식 정리/알고리즘

알고리즘 지식 정리(10월 8일)[프로그래머스 레벨 2]

Neoself 2024. 10. 8. 18:53

최댓값과 최솟값

func solution(_ s: String) -> String {
    let myArr = s.components(separatedBy: " ").compactMap{ Int($0) }
    return "\(myArr.min() ?? 0) \(myArr.max() ?? 0)"
}

.components(separatedBy: " ")

Swift의 String 클래스에서 제공하는 메서드입니다.

함수를 통해 "1 2 3 4"와 같이 공백과 함께 주어진 String값들을 데이터 접근이 용이한 [String] 타입의 배열로 반환합니다.

 

.compactMap {}

Swift의 고차 함수 중 하나로, map과 filter 기능을 결합한 것과 유사하다고 생각하면 된다.

이때, 변환한 결과가 nil이면 자동으로 제거하며, 옵셔널이 일괄 언래핑된다.

 

이때 고차함수는 하나 이상의 함수를 인자로 취하거나, 함수를 결과로 반환하는 함수인데, compactMap 함수의 경우, 함수 뒤의 클로져에서 선언된 함수를 인자로 하기 때문에 고차함수이다.

 

 

마지막으로, [Int] 타입의 myArr를 min()과 max() 함수를 적용해 최소값과 최댓값을 구한다.

 

올바른 괄호

func solution(_ s:String) -> Bool {
    var myBool = true
    var myArr: [String] = []
    var splitedArr = s.map{ String($0)}
    splitedArr.map {
        if $0 == ")" {
            if myArr.count == 0 {
                myBool = false
            } else{
                myArr.popLast()
            }
        } else{
            myArr.append($0)
        }
    }
    if myArr.count != 0 {
        myBool = false
    }
    return myBool
}

 

 

String 타입에 .map 함수를 적용할 경우, 각 요소는 Character로 변환됩니다. 따라서 클로져에 String 타입으로 변환하는 함수를 실행해 전달받은 "((())"와 같은 String값을 개별 문자열로 나누어 배열로 반환토록 합니다.

이때 components(separatedBy:"")로 빈 문자열로 분리하지 않은 이유는, 각 문자 사이, 그리고 문자열의 시작과 끝에 구분자가 있다고 간주되어 처리되기 때문입니다. 따라서, 결과 배열은 시작과 끝에 빈 문자열이 포함된 값이 반환되게 됩니다.

ex. "","(","(",...,""

 

배열이 가공되었다면 map 함수를 활용해, 각 요소에 대해 ")"인지 여부를 확인하며, 각 상황에 따라 사전에 생성한 myArr 배열을 활용해 괄호가 잘 맞대어져있는지 여부를 체크합니다. 

splitedArr의 순회를 모두 마친 후에는, myArr에 남아있는 문자열이 있는지 최종확인한 후에, myBool을 반환하는 로직으로 구성했습니다.

 

최솟값 만들기

func solution( A:[Int],  B:[Int]) -> Int
{
    return zip(A.sorted(),B.sorted { $0 > $1 }).map { $0 * $1 }.reduce(0, +)
}

.sorted()함수의 경우, 기본적으로 주어진 배열을 오름차순으로 정렬하며, sorted{$0>$1}의 경우 내림차순으로 정렬합니다.

 

그 후, zip을 활용하여 튜플 시퀀스를 생성하는데요.

이때 시퀀스는 반복문을 통해 통해 순서대로 하나씩 접근할 수 있는 값들의 목록을 의미합니다.  Swift에서는 배열, 범위와 문자열(!) 등이 시퀀스로 분류된다. 튜플 시퀀스는 각 요소가 튜플인 시퀀스로 키-값 쌍을 다룰때나, 두개 이상의 관련 데이터를 함께 처리하는 등, 복잡한 데이터 구조를 간단히 표현할 때 사용됩니다.

이 튜플 시퀀스에 map 함수를 적용할 경우, 클로저로 $0과 $1을 활용할 수 있으며, 이는 각각 A와 B의 요소들을 나타냅니다. 마지막으로 reduce 함수를 통해 두 요소들을 곱한 값을 더해주면서, 곱들을 모두 더한 최종값을 반환해줍니다.