Skip to content

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

Closed
@hwangJi-dev

Description

@hwangJi-dev

📌 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

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions