Swift

[Swift] 알고리즘에 필요한 Tip 정리

thoonk: 2024. 5. 21. 22:36
반응형

스위프트 알고리즘을 시작하면서 필요한 내용을 정리한 것을 올립니다! 

시간 날 때마다 계속 추가할 예정..!

 

기본 입력 받기 (input의 타입은 String)

var input = readLine()!

 

Int형 한 개의 숫자 입력 받기

var num = Int(readLine()!)!

 

"1 2 3 4 5"와 같은 공백 있는 숫자 입력 받기

// split - ReturnType: [SubString]
var nums = readLine()!.split(separator: " ").map {Int($0)!}

// components - ReturnType: [String]
var nums = readLine()!.components(separatedBy: " "). map {Int($0)!}

 

"12345"와 같은 공백 없는 숫자를 배열로 입력 받기 

바로 Int($0)! 보다 Int(String($0))! 가 속도가 더 빠르다고 합니다.

var nums = Array(readLine()!).map {Int(String($0))!}

// String 변수 삽입해도 가능합니다.
var nums = Array(numbers).map {String($0)}

 

1차원 배열 선언 방법 (원하는 데이터 타입으로..)

let arr = [Int]()

let arr = Array(repeating: 0, count: 5)
let arr = [Int](repeating: 0, count: 5)

 

2차원 배열 선언 방법

let arr = [[Int]]()

let arr = Array(repeating: Array(repeating: 0, count: 3), count: 5)
let arr = [[Int]](repeating: [Int](repeating: 0, count: 3), count: 5)

let arr = Array(repeating: [Int](), count: 5)
// graph에서 다른 노드와 다른 노드와의 거리를 Set으로 사용할 경우
var graph = Array(repeating: [(Int, Int)](), count: n)

 

배열 역순으로 뒤집기

arr.reverse()
arr = arr.reversed()

 

배열 정렬하기

// 오름차순
arr.sort()
arr.sort(by: <)
arr = arr.sorted(by: <)

// 내림차순
arr.sort(by: >)
arr = arr.sorted(by: >)

 

배열의 특정 요소 개수 세기 

let arr = ["D", "D", "R", "D"]
arr.filter { $0 == "D" }.count // 3

 

배열의 각 요소의 수 세기(Counter)

let arr = ["one", "two", "three", "four", "one"]
var counter = [String: Int]()
arr.forEach { counter[$0, default: 0] += 1 }
print(counter) // ["three": 1, "one": 2, "two": 1, "four": 1]

 

고차함수 (map, filter, reduce)

let array = ["1","2","3","4","5"]

// map
// [1,2,3,4,5]
var newArray = array.map { (value: String) -> Int in
    Int(value)!
}
// 위 식을 간소화
newArray = array.map { Int($0)! }

// filter
// [4,5]
newArray = newArray.filter { (value: Int) -> Bool in
    return value > 3
}
newArray = newArray.filter { $0 > 3 }

// reduce
// 20
let result1 = newArray.reduce(1) { (n1: Int, n2: Int) in
    return n1 * n2
}
// return과 타입 생략 가능
let result2 = newArray.reduce(1) { (n1, n2) in
    n1 * n2
}
// 1은 초기 값
let result3 = newArray.reduce(1) { $0*$1 }

let result4 = newArray.reduce(1, *)

 

sum (reduce() 활용, nums의 데이터 타입: [Int])

nums.reduce(0, +)

 

거듭 제곱

pow(밑: Double, 지수: Double)
let n = 2
Int(pow(2.0, Double(n))) // 4

 

제곱근

let n: Int = 4
Int(sqrt(Double(n))) // 2

// sqrt(_: Double) -> Double

 

for문 stride 활용

// 0 1 2 3 4 
for i in stride(from: 0, to: 5, by: 1){}
// 0 1 2 3 4 5
for i in stride(from: 0, through: 5, by: 1){}

 

type 확인하기

print(type(of: input))

 

소수점 아래 자리수 제한하여 스트링으로 표현

String(format: "%.2f", value)

 

문자열 자르기

var s = "HelloWorld"
var firstIndex = s.index(s.startIndex, offsetBy: 0)
var lastIndex = s.index(s.endIndex, offsetBy: -5)
// "Hello"
var v = s[firstIndex ..< lastIndex]

// "Hello"
var prefix = s.prefix(5)
// "World"
var suffix = s.suffix(5)

// 배열을 이용하여 문자열 자르고 합치기
var index = 4
var hello = w[w.startIndex...index].map{String($0)}
var world = w[index+1..<w.endIndex].map{String($0)}
var helloWorld = hello.joined() + world.joined()

 

절대값

abs(-11) // 11

 

올림(ceil), 내림(floor), 반올림(round)

ceil(Double)
ceil(6.3) // 7.0

floor(Double)
floor(4.3) // 4.0

round(Double)
round(5.5) // 6.0

// 원하는 소수점까지 반올림하고 싶을 때
var value = 1.543
value = round(value * 100) / 100 // 1.54

 

String 대문자 또는 소문자로 바꾸기

var s = "Hello, Swift"

s.lowercased() // hello, swift
s.uppercased() // HELLO, SWIFT

 

문자열 치환

import Foundation

let str = "Hello, Swift"
let replacedStr = str.replacingOccurrences(of: "Hello", with: "Hi") // Hi, Swift

 

진수 변환

let num = 45

// String(var, radix: 3)의 경우 var의 타입은 Int
String(num, radix: 3) // 1200

// Int(var , radix: 3)의 경우 var의 타입은 String
// 45를 3진법으로 변환하고 앞뒤를 반전시킨 값을 10진법으로 표현한 것입니다. 
Int(String(String(num, radix: 3).reversed()), radix: 3)! // 7

 

아스키코드 변환

// Character -> Ascii
Character("a").asciiValue! // 97, Return Type: UInt8

// Ascii -> String or Character
let c = Character(UnicodeScalar(97)) // a
let s = String(UnicodeScalar(65)) // A

// String -> Ascii 함수
func strToAscii(_ str: String) -> Int {
	str.map { $0.asciiValue! }.map { Int($0) }.reduce(0,+)
}

 

String 식 계산하기

let expr = NSExpression(format: "10-20*30+20")
let result = expr.expressionValue(with: "-", context: nil) as! Int // -570

 

2차원 배열 -> 1차원 배열 만들기

var arr = [[1,2,3],[2,3],[4]]
let flatten = arr.flatMap { $0 } // [1, 2, 3, 2, 3, 4]
let reduced = arr.reduce([], +) // [1, 2, 3, 2, 3, 4]
let joined = Array(arr.joined()) // [1, 2, 3, 2, 3, 4]

 

Subsequence(ArraySlice) -> Array

// nums 배열에서 특정 구간을 잘라서 res 배열에 넣는 상황
let nums = [0,1,2,3,4,5]
var res = [[Int]]()
// Subsequence 타입을 다시 Array로 캐스팅해야 res에 넣을 수 있음
res.append(Array(nums[nums.firstIndex(of: 3)!...])) 
// res -> [[3,4,5]]
 

 

범위 체크 (그래프에서 좌표 예시)

let n = 5, m = 6

func checkBorder(_ r: Int, _ c: Int) -> Bool {
    0..<n ~= r && 0..<m ~= c
}

print(checkBorder(3, 4)) // true
print(checkBorder(4, 7)) // false
반응형