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
반응형