HIT해

[Swift] Swift 수학 연산 및 Reduce 본문

Swift/Swift 알고리즘

[Swift] Swift 수학 연산 및 Reduce

힛해 2024. 11. 2. 05:31
728x90

1. 기본 수학 연산

산술 연산

// 기본 연산자
let sum = 5 + 3        // 8
let difference = 10 - 4 // 6
let product = 6 * 7    // 42
let quotient = 20 / 4  // 5
let remainder = 22 % 5 // 2

// 복합 할당 연산자
var number = 5
number += 3  // number = 8
number *= 2  // number = 16

고급 수학 함수

import Foundation

// 거듭제곱과 제곱근
let power = pow(2.0, 3.0)  // 8.0 (2의 3승)
let squareRoot = sqrt(16.0) // 4.0
let cubeRoot = cbrt(27.0)   // 3.0 (세제곱근)

// 절대값
let absoluteValue = abs(-10)   // 10
let doubleAbs = fabs(-10.5)    // 10.5

// 반올림 함수들
let rounded = round(3.7)     // 4.0
let ceiling = ceil(3.2)      // 4.0
let floor = floor(3.8)       // 3.0
let truncated = trunc(3.7)   // 3.0

최대/최소 및 비교

// 단일 값 비교
let maximum = max(5, 10)     // 10
let minimum = min(5, 10)     // 5

// 배열에서 최대/최소 찾기
let numbers = [1, 5, 3, 7, 2]
let maxNumber = numbers.max() // Optional(7)
let minNumber = numbers.min() // Optional(1)

2. 삼각함수 및 각도 변환

삼각함수

// 기본 삼각함수
let sineValue = sin(Double.pi / 2)     // 1.0
let cosineValue = cos(0)               // 1.0
let tangentValue = tan(Double.pi / 4)  // 1.0

// 역삼각함수
let arcSine = asin(1.0)      // π/2
let arcCosine = acos(1.0)    // 0
let arcTangent = atan(1.0)   // π/4

각도 변환

// 도(degrees)를 라디안(radians)으로 변환
func degreesToRadians(_ degrees: Double) -> Double {
    return degrees * .pi / 180
}

// 라디안을 도로 변환
func radiansToDegrees(_ radians: Double) -> Double {
    return radians * 180 / .pi
}

3. 로그 및 지수 함수

로그 함수

// 자연로그 (밑이 e)
let naturalLog = log(2.718281828)    // ≈ 1.0

// 밑이 10인 로그
let base10Log = log10(100)           // 2.0

// 밑이 2인 로그
let base2Log = log2(8)               // 3.0

지수 함수

// e의 거듭제곱
let exponential = exp(1)             // ≈ 2.718281828 (e¹)
let exp2Value = exp2(3)             // 8.0 (2³)

4. 난수 생성 및 진법 변환

난수 생성

// 정수 난수
let randomInt = Int.random(in: 1...10)
let randomEvenInt = Int.random(in: stride(from: 0, through: 10, by: 2))

// 실수 난수
let randomDouble = Double.random(in: 0.0...1.0)
let randomFloat = Float.random(in: -1.0...1.0)

진법 변환

// 10진수를 다른 진법으로 변환
let binary = String(42, radix: 2)      // "101010"
let octal = String(42, radix: 8)       // "52"
let hex = String(42, radix: 16)        // "2a"

// 다른 진법을 10진수로 변환
let decimalFromBinary = Int("101010", radix: 2)    // Optional(42)
let decimalFromHex = Int("2a", radix: 16)          // Optional(42)

5. Reduce 활용

기본 축소 연산

let numbers = [1, 2, 3, 4, 5]

// 합계 계산
let sum = numbers.reduce(0, +)          // 15

// 곱셈 계산
let product = numbers.reduce(1, *)      // 120

// 최대값 찾기
let max = numbers.reduce(Int.min, max)  // 5

문자열 처리

let words = ["Swift", "is", "awesome"]

// 문자열 연결
let sentence = words.reduce("") { 
    $0.isEmpty ? $1 : $0 + " " + $1 
}
// "Swift is awesome"

// 문자 개수 세기
let characterCount = words.reduce(0) { 
    $0 + $1.count 
}  // 13

복잡한 변환

// 배열을 딕셔너리로 변환
let names = ["Alice", "Bob", "Charlie"]
let lengthDict = names.reduce(into: [:]) { dict, name in
    dict[name] = name.count
}
// ["Alice": 5, "Bob": 3, "Charlie": 7]

// 조건부 필터링과 변환
let numbers = [1, 2, 3, 4, 5]
let sumOfSquaresOfEvens = numbers.reduce(0) { sum, num in
    num % 2 == 0 ? sum + num * num : sum
}
// 20 (2² + 4²)

중첩 데이터 처리

// 2차원 배열 평탄화
let matrix = [[1, 2], [3, 4], [5, 6]]
let flattened = matrix.reduce([], +)
// [1, 2, 3, 4, 5, 6]

// 중첩 딕셔너리 생성
let data = [(name: "Alice", age: 25), (name: "Bob", age: 30)]
let groupedByAge = data.reduce(into: [:]) { dict, person in
    dict[person.age, default: []] += [person.name]
}
// [25: ["Alice"], 30: ["Bob"]]