본문 바로가기
iOS/Swift

[Swift] Swift 알고리즘 - 수학

by 0inn 2022. 10. 13.

제곱 구하기

let value = 3.0	// 소수점으로 선언해야 함
pow(value, 2) // 9.0

 

순열

func permutation<T: Comparable>(_ arr: [T], _ n: Int) -> [[T]] {
    var result = [[T]]()
    if arr.count < n { return result }
    
    var visit = Array(repeating: false, count: arr.count)
    
    func cycle(_ now: [T]) {
        if now.count == n {
            result.append(now)
            return
        }
        for i in 0..<arr.count {
            if visit[i] { continue }
            visit[i] = true
            cycle(now + [arr[i]])
            visit[i] = false
        }
    }
    
    cycle([])
    
    return result
}

 

 

조합

func combination<T: Comparable>(_ arr: [T], _ n: Int) -> [[T]] {
    var result = [[T]]()
    if arr.count < n { return result }
    
    func cycle(_ idx: Int, _ now: [T]) {
        if now.count == n {
            result.append(now)
            return
        }
        for i in idx..<arr.count {
            cycle(i + 1, now + [arr[i]])
        }
    }
    
    cycle(0, [])
    
    return result
}

// 사용법
combination(arr, n)

 

에라토스테네스의 체

var n = 100	// 최대 숫자

var primeArr = [Int](repeating: 0, count: n + 1)

for i in 2...n {
    primeArr[i] = i
}

for i in 2...n {
    if primeArr[i] == 0 {
        continue
    }
    
    for j in stride(from: i*i, through: n, by: i) {
        primeArr[j] = 0
    }
}

// x이 소수인지 아닌지 찾기
if primeArr[x] != 0 {
   print("Prime")
}

 

소수 판별

// for문
func isPrime(_ n: Int) -> Bool {
	if n == 1 { return false }
    if n == 2 || n == 3 { return true }
    
    let sq = Int(sqrt(Double(n)))
    
    for i in 2...sq {
    	if n % i == 0 { return false }
    }
    
    return true
}


// while문
func isPrime(_ n: Int) -> Bool {
	if n == 1 { return false }
    if n == 2 || n == 3 { return true }
    
    let sq = Int(sqrt(Double(n)))
    
    while i <= sq {
    	gaurd n % i != 0 else { return false }
        i += 1
    }
    
    return true
}

 

 

진수 구하기

var ten = 100
var tenToTwo = ""
var twoToTen = 0
var twoToSixteen = ""

// 10진수 -> 2진수
tenToTwo = String(value, radix: 2)

// 2진수 -> 10진수
twoToTen = Int(tenToTwo, radix: 2)!

// 2진수 -> 16진수
twoToSixteen = String(tenToTwo, radix: 16)

 

 

소수점 다루기

var num = 5.245

// 반올림
round(num)

// 올림
ceil(num)

// 내림
floor(num)

// 버림
trunc(num)

// 소수점 자르기
String(format: "%.2f", num)	// 소수점 2자리까지 자르기