Neoself의 기술 블로그

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

개발지식 정리/알고리즘

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

Neoself 2024. 10. 14. 10:43

약수의 개수와 덧셈

func addMinus(_ left:Int, _ right:Int) -> Int {
    var ans = 0
    for i in left...right {
        var cnt=1 // 원래 수
        if i != 1 {
            for a in 1...i/2 {
                if i%a==0 {cnt+=1}
            }
        }
        ans += cnt%2==0 ? i : -i
    }
    return ans
}

... 연산자를 활용하여 순회할 범위를 지정한 다음, 매 순회마다 %연산자로 약수인지 여부를 파악하였다. 이때 시간복잡도를 줄이고자 순회하는 범위를 i가 아닌 i/2로 축소하였는데, 이의 경우 i가 1일 경우는 1...0을 참조하는 즉 core dumped 문제가 발생할 수 있기 때문에 예외처리를 진행해주었다. 또한 범위가 축소됨에 따라 약수범위에 본인이 포함되지 않기 때문에 cnt 초기값을 1로 지정하여 이를 사전에 포함시켜주었다.

 

문자열 내림차순으로 배치하기

func solution(_ s:String) -> String {
    var lower = Array(s).filter{$0.isLowercase}.map{String($0)}
    var upper = Array(s).filter{$0.isUppercase}.map{String($0)}
    return lower.sorted(by: >).joined()+upper.sorted(by: >).joined()
    //return String(s.sorted { $0 > $1 }) ?????
}

String으로 이루어진 배열 또한 sorted() 함수 적용 시, 알파벳 순서에따라 정렬이 된다. 이를 활용하여 인자 String을 Array로 변환 후, 마지막에 joined() 처리를 하였다.

 

부족한 금액 계산하기

func calculatePrice(_ price:Int, _ money:Int, _ count:Int) -> Int64{
    var total = (1...count).reduce(0,{$0+$1*price})
    return total>=money ? Int64(total-money) : Int64(0
}

이용횟수와 놀이기구 초기 이용료로 이루어진 총 비용을 ... 연산자로 구성된 튜플, reduce함수로 구성해주었다.

 

 

문자열 다루기 기본

func handleString(_ s:String) -> Bool {
    return Int(s) != nil && (Array(s).count == 4 || Array(s).count == 6)
}

Int타입으로 변환을 시도할때, 본래 String값이 숫자로만 이루어지지 않았다면 nil을 반환한다. 이를 활용하여 숫자만 있는지 여부를 파악하고, String의 길이를 성능저하없이 파악하기 위해 Array 변환 후 count 호출로 String 길이까지 파악하는 로직을 구성했다.

 

 

행렬의 덧셈

func addition(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    return arr1.enumerated().map{(id,arr) in arr.enumerated().map{(_id,num) in num+arr2[id][_id]}}
}

enumerated()를 활용하여 map 고차함수에서 index값을 접근하였으며, 2차원 배열이기에 map을 이중으로 사용하여 요소 간 덧셈을 진행하였다.

func addition(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    return zip(arr1, arr2).map{zip($0,$1).map{$0+$1}}
}

다른 사람의 코드를 보니 zip 함수를 통해 시퀀스 간 연산을 아주 깔끔하게 진행하였다,... 현재 문제의 경우 두개 시퀀스 길이가 동일하지만, 만일 다른 길이의 두 시퀀스를 zip 함수로 접근할 경우, 더 짧은 것의 길이만큼 시퀀스를 최종 반환한다.

- 외부 zip(arr1,arr2)를 통해 두개 2차원 배열의 행을 짝짓는다

- 첫번째 map을 통해 각 행에 대해 연산 수행

- 내부 zip($0,$1)을 통해 행의 각 요소를 다시 짝짓는다.

 

감사합니다.