
알고리즘 테스트 풀때 기본중의 기본 reduce...
사용하는 곳이 다양한 만큼 공부 시작!

배열을 다룰때 사용
swift는 map같은 배열 순회하는 메소드를 사용하거나 할떄 클로져 문법으로 $을 이용해 값을 꺼내와 쓸수 있다
특히 reduce는 배열의 합, 곱, 또는 문자열 결합 같은 작업에 유용하게 사용이 가능하다
""나 0 같은 초기값과 클로저를 인자로 받고
배열의 각 요소에 대해 클로저를 호출하여 하나의 값을 생성해준다.
위에 캡쳐본에서처럼 arr은 매개변수이기에 상수인데 새로운 값을 생성하는 것이기에 retrun에 바로 사용이 가능하다
func reduce<Result>(
_ initialResult: Result,
_ nextPartialResult: (Result, Self.Element) throws -> Result
) rethrows -> Result
initialResult : 시작 값
nextPartialResult : 연산을 수행하는 클로저로 누적된 결과와 배열의 현재 요소를 입력으로 받아 새로운 결과를 반환한다
throws : 에러를 발생시킬수 있다고 선언 해두는 것
rethrows: 에러가 발생할경우 초기 시작 값을 리턴하도록 함
$0: 현재까지 연산된/누적된 결과 값
$1: 배열의 현재 요소/다음으로 처리할 값
// 축약형 매개변수 ($0, $1)를 사용하는 방식
let sum1 = numbers.reduce(0) { $0 + $1 }
print(sum1) // 출력: 10
// 명시적인 매개변수 이름 (x, y)을 사용하는 방식
let sum2 = numbers.reduce(0) { x, y in
x + y
}
$0, $1말고 매개변수 x와 y로도 명시해서 사용이 가능하다
하지만 매개변수로 코드가 좀더 복잡한식을 보기 쉽게 만드는 것이 아니라면
짧은 $0, $1을 쓰면 된다
배열 연산시 무언가 문제가 있다면 reduce는 시작값을 던져주기에
에러 핸들링에 쓰거나 무슨 무슨 오류 시 -1을 리턴 한다 같은 알고리즘 테스트 조건이 있을 때 사용하기 좋다
let numbers = [1, 2, 3, 4, 5]
print(numbers.reduce(0, { $0 + $1 })) // 15
숫자의 덧셈
print(numbers.reduce(1, { $0 * $1 })) // 120
숫자의 곱셈
곱셈을 할때는 0에 값을 곱해 순회하고도 0 나오는 오류 방지를 위해 초기값을 꼭 1로 해야한다
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 } // 결과: [1, 4, 9, 16, 25] 제곱 배열
reduce는 하나의 값(예: 숫자, 문자열 등) 반환
map은 새로운 배열을 반환
reduce는 배열을 순회해서 하나의 값을 만들어낼때 사용 된다면
map은 배열을 순회하며 새로운 배열을 만들어낸다
둘다 원본 배열을 바꾸는 것이 아니라 새로운 값을 만들어 냄

그리고 문제 풀면서 문자 "l" 보다 앞선 문자를 l로 바꾸는 문제가 있었는데
비교를 어떻게 하면 될까 16진수로 변경해서 그값으로 따져보는 방법이 있나?
없으면 그냥 문자 배열로 앞선 문자 리스트를 만들고 거기에 포함되면 바꿔버리는 식으로 해야하나 등등 별 생각을 했는데 굳이 변경 안하더라도 아스키 코드로 바꿔서 비교하기에 이렇게 비교가 가능했다...
let numbers = [1, 2, 3, 4, 5]
numbers.filter { $0 % 2 == 0 } // 결과: [2, 4]
조건에 맞는 요소들만 뽑아 새 배열을 반환
let strings = ["1", "two", "3", "four"]
strings.compactMap { Int($0) } // [1, 3]
클로저 내부의 로직을 하고 nil이 되지 않는 새로운 배열을 반환
let nestedArrays: [Int?] = [[1, 2], nil, [3, 4], [5] , nil]
nestedArrays.flatMap { $0 } // [1, 2, 3, 4, 5]
중첩 배열을 평탄화하여 하나의 새로운 배열로 반환
compactMap과 유사하게 nil을 제거해준다
]
var sum = 0
let numbers = [1, 2, 3, 4, 5]
numbers.forEach { print($0) } // 각 요소를 출력만 함
numbers.forEach { sum += $0 } // sum에 배열을 연산함
print(sum) // 출력: 15
배열의 각 요소에 대해 작업을 수행하지만 반환 값은 없음
기존 배열을 조작하지도 않으며 그저 배열 값을 순회하기만 한다
클로저 안에서 동작을 통해 값을 이용만 한다
프로그래머스 풀고 다른 사람들 정답 보면 그냥 반복문 조건문 써서 반복의 조건을 반복해서 반복하는게 아니라 메서드들을 이용해서 여러 방법으로 만들어서 쓰는 걸 보는 재미가 있어..