Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Algorithm] 없는 숫자 더하기 #4

Closed
2 tasks done
hwangJi-dev opened this issue Aug 1, 2022 · 0 comments
Closed
2 tasks done

[Algorithm] 없는 숫자 더하기 #4

hwangJi-dev opened this issue Aug 1, 2022 · 0 comments

Comments

@hwangJi-dev
Copy link
Owner

hwangJi-dev commented Aug 1, 2022

📌 TODO

  • 문제 풀기
  • 정리하기

없는 숫자 더하기

💬 Idea

  • 0~9 사이의 숫자들 중 주어진 numbers 배열에서 존재하지 않는 리스트를 filter로 구하자.
  • 존재하지 않는 숫자 리스트를 for문으로 돌며 더하여 정답을 구하자.

소요시간 : 4분 30초

💬 더 나은 방법?

  • fullNumberList를 배열로 만들지 않고 for문에서 0…9의 제한사항을 두는 것

    → 메모리 효율성 측면에서나, 코드의 간결함 측면에서나 더 나은 것 같다는 생각이 들었다.

    import Foundation
    
    func solution(_ numbers:[Int]) -> Int {
    		var answer = 0
    
    		for i in 0...9 {
    		    if !numbers.contains(i) {
    		        answer += i
    		    }
    		}
    		
    		return answer
    }
  • 0부터 9까지 숫자 중에서 numbers에 포함되지 않은 숫자들을 filter로 거르고, 걸러진 숫자를 reduce로 더하는 것

    • for문을 사용하지 않고 고차함수들을 사용하여 한줄로 풀이를 끝낼 수 있어 효율적이라고 느껴졌다.
    import Foundation
    
    func solution(_ numbers:[Int]) -> Int {
    		return (0...9).filter { !numbers.contains($0) }.reduce(0, +)
    }

💬 알게된 문법

✅ contains

  • 시퀀스에 지정된 요소가 포함되어 있는지에 대한 여부를 나타내는 bool 값을 반환

    let numList = [0, 1, 2, 3, 4, 5, 6]
    print("contains", numList.contains(0))
    // Print "contains, true"

✅ map

  • 클로저로 각 항목들을 반영한 결과물을 가진 새로운 배열을 반환합니다.

    // Declaration
    func map<U>(transform: (T) -> U) -> Array<U>
    
    [x1, x2, ... xn].map(f) -> [f(x1), f(x2), ... , f(xn)]
    
    // transform을 지원하는 클로저는 변경된 값을 반환하기 위해 해당 타입의 값을 반환해야 합니다.
    // 다음은 [1, 2, 3, 4]인 배열에서 2씩 곱한 배열을 얻는 예제입니다.
    
    let array = [0, 1, 2, 3]
    let multipliedArray = array.map( { (value: Int) -> Int in return value * 2 } )
    // [2, 4, 6, 8]
    
    // map에서도 추론하여 코드를 생략할 수 있습니다. 우선, value의 타입 Int와 return 키워드는 추론을 통해 생략 가능합니다.
    array.map( { (value) -> Int in value * 2 } )
    
    // -> Int도 생략 가능합니다.
    array.map( {value in value * 2 } )
    
    // value는 여러번 사용하므로 $0으로 축약할 수 있습니다.
    array.map( {$0 * 2} )
    
    // 또한, 괄호도 생략 가능합니다.
    array.map { $0 * 2 }
    
    // 만약 값에 문자열 “Number : “를 붙인다면 다음과 같이 사용할 수 있습니다.
    array.map{ "Number :  \($0)" }

✅ filter

  • 주어진 술어를 만족하는 시퀀스의 요소를 순서대로 포함하는 배열을 반환

  • 클로저로 각 항목들을 비교하여 일치하는 결과물을 가진 새로운 배열을 반환합니다.

    func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
    // * isIncluded를 allow(만족)하는 요소들의 집합을 return한다.

✅ reduce

  • 주어진 클로저를 사용하여 시퀀스의 요소를 결합한 결과를 반환합니다.

  • 배열의 각 항목들을 재귀적으로 클로저를 적용시켜 하나의 값을 만듭니다.

    • 연산자는 중위 연산자로 왼쪽 값이 $0, 오른쪽 값이 $1임을 추론 가능하므로 다음과 같이 생략 가능합니다.

      array.reduce( 0, + )

  • 시간복잡도: O(n), where n is the length of the sequence.

    // Declaration
    func reduce<U>(initial: U, combine: (U, T) -> U) -> U
    
    array.reduce(0, { (s1: Int, s2: Int) -> Int in
        return s1 + s2
    })
    
    // 클로저는 함수의 마지막에 위치하면 다른 인자와 분리하여 작성할 수 있습니다.
    array.reduce(0) { (s1: Int, s2: Int) -> Int in
        return s1 + s2
    }
    
    // 위 코드에서 s1, s2의 타입은 추론하므로 생략 가능합니다.
    array.reduce(0) { (s1, s2) in s1 + s2 }
    
    // s1과 s2는 $0, $1로 대신하여 사용할 수 있습니다.
    array.reduce(0) { $0 + $1 }

✅ subtract

  • 해당 set에서 주어진 set의 요소를 제거합니다. → String 배열에 적합

  • 배열의 공통 요소를 제거할 때 유용함

    var employees: Set = ["Alicia", "Bethany", "Chris", "Diana", "Eric"]
    let neighbors: Set = ["Bethany", "Eric", "Forlani", "Greta"]
    employees.subtract(neighbors)
    print(employees)
    **// Prints "["Diana", "Chris", "Alicia"]"**

✅ ClosedRange

  • 하한에서 상한까지의 간격

  • 닫힌 범위 연산자 (…)를 사용하여 ClosedRange 인스턴스를 만들 수 있음

    let throughFive = 0...5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant