Closed
Description
📌 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