Neoself의 기술 블로그

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

개발지식 정리/알고리즘

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

Neoself 2024. 10. 12. 22:06

평균 구하기

func getMean(_ arr: [Int]) -> Double {

    return Double(arr.reduce(0,+))/Double(arr.count)

}

reduce 고차함수를 사용해 총합을 구한후, 인자 배열 내부 요소 개수를 나누어 평균값을 구하였습니다. 이때 반환 타입 Double임을 유의하여 타입을 수동 지정해주었습니다.

 

x만큼 간격이 있는 n개의 숫자

시간복잡도: O(n) = map 고차함수로 모든 요소 순회하기 때문

func x_n_other(_ x:Int, _ n:Int) -> [Int64] {

    return Array(1...n).map { Int64($0 * x) }

}

 

1...n로 1~n까지의 범위를 생성한 후, Array 함수에 삽입하여, 1부터 n까지 순차적으로 요소가 들어간 배열을 생성합니다. 그 후 map 고차함수로 각 요소마다 주어진 x값을 곱해줍니다.

 

자릿수 더하기

시간복잡도: O(n = 입력숫자의 자릿수) 

func addPlaceNum(_ n:Int) -> Int {

    return String(n).map{Int(String($0))!}.reduce(0,+)

}

Int 타입의 인자를 map 고차함수 사용이 가능한 String 타입으로 변경한 후, 각 요소들마다 reduce함수로 일괄 덧셈 적용이 가능한 Int 타입으로 재변경을 해주었다.

 

문자열 내 p와 y의 개수

시간복잡도:

    lowercased : O(n = 문자열 길이)

    filter : O(n) * 2

 

func solution(_ s:String) -> Bool {    

    return s.lowercased().filter { $0 == "p" }.count == s.lowercased().filter { $0 == "y" }.count

}

문자열이 대문자와 소문자일 경우를 모두 대응해야하기 때문에, 조건을 늘리기보다 먼저 모든 문자를 소문자로 변경하여 변수를 제거하였다. 그 이후에 filter 고차함수와 count를 활용하여 각 문자의 개수를 구한 후 개수 일치 여부를 Bool 타입으로 반환하게끔 구성하였다.


자연수 뒤집어 배열로 만들기

시간복잡도:
    String : O(n
)

    map : O(n = 입력값 자릿수)
    reversed : O(n
)

 

func flipNaturalNum(_ n:Int64) -> [Int] {

    return String(n).map{Int(String($0))!}.reversed()

}

마찬가지로 map 고차함수 실행이 가능한 String 타입으로 변경해준 후, map 함수를 적용하였다. 이때 String을 map으로 각 요소를 순회하게 되면, $0은 Character 타입이 된다. Int 적용이 가능한 String으로 다시 변환해준 후, Int로 다시 변환. 이 때 String이 Int로 변경하지 못하는 글자일 수도 있기 때문에 Int()는 옵셔널 타입이 되는데, !로 이를 막아준다. 마지막으로 Int 타입 요소 배열로 변환을 마치면. reversed 함수로 순서 뒤집기