Language/Swift

[Swift] 알고리즘을 대비한 메서드들

jaewpark 2024. 2. 18. 21:55

반복문

Stride

지정된 값만큼의 시퀀스를 반환합니다. 이해를 쉽게 이야기하면
stride(from:to:by:) 는 from:이상 to:미만의 구간과 동일합니다.
stride(from:through:by:)from: 이상 through: 이하 구간과 동일합니다.

stride(from: 0, to: 10, by: 2).forEach {
    print($0, terminator: ", ")
}
// 0, 2, 4, 6, 8

stride(from: 0, through: 10, by: 3).forEach {
    print($0, terminator: ", ")
}
// 0, 3, 6, 9

stride(from: 20, through: 10, by: -2).forEach {
    print($0, terminator: ", ")
}
// 20, 18, 16, 14, 12, 10

Array.Indices

배열의 유효한 인덱스를 오름차순으로 나타내는 유형입니다.

let arr = [1, 4, 6, 13, 9, 7, 3, 5, 16]
print(arr.indices)
// 0..<9

let arr2 = arr.indices.map { $0 }
print(arr2)
// [0, 1, 2, 3, 4, 5, 6, 7, 8]

String(repeating:count:)

지정된 횟수만큼 반복된 주어진 문자열을 나타내는 새 문자열을 만듭니다.

let str = "apple"
let str2 = String(repeating: str, count: 3)

print(str2)
// appleappleapple

배열 요소를 특정 요소로 변경

replaceSubrange

정해진 구간의 값을 변경합니다.
문자열을 변경하기 위해서는 Range<String.Index> 타입으로 넣어줘야 합니다.

var arr = [1, 4, 6, 13, 9, 7, 3, 5, 16]
arr.replaceSubrange(1...3, with: [2, 4, 6])
print(arr)
// [1, 2, 4, 6, 9, 7, 3, 5, 16]

var str = "Hello, world"
let startIndex = str.index(str.startIndex, offsetBy: 7)
str.replaceSubrange(startIndex..<str.endIndex, with: "apple")
print(str)
// Hello, apple

swapAt

배열의 요소를 변경합니다.

var numbers = [1, 2, 3, 4, 5]
numbers.swapAt(1, 3)
print(numbers)
// [1, 4, 3, 2, 5]

reverse

배열의 요소를 반전시킵니다.

var arr = [1, 4, 6, 13, 9, 7, 3, 5, 16]
arr[2...5].reverse()

print(arr)
// [1, 4, 7, 9, 13, 6, 3, 5, 16]

특정 값 검색

[String] hasPrefix / hasSuffix

입력된 문자열이 앞/끝 부분에 있는지 확인합니다.

var text = "Hello, World!"

print(text.hasPrefix("Hello"))    // true
print(text.hasPrefix("el"))    // false

print(text.hasSuffix("!"))    // true
print(text.hasSuffix("World"))    // false

text.removeLast()
print(text.hasSuffix("World"))    // true

firstIndex(of:) / lastIndex(of:)

지정된 값이 나타나는 첫/마지막 인덱스를 반환합니다.
값이 없다면 nil 입니다.

let text = "Hello, World!"
let st = text.firstIndex(of: "l")!
let et = text.lastIndex(of: "l")!

print(text[st...et])    // llo, Worl

let array = [1, 2, 3, 4, 5, 6, 4, 4, 9]
let sa = array.firstIndex(of: 4)!
let ea = array.lastIndex(of: 4)!

print(array[sa...ea])    // [4, 5, 6, 4, 4]

contains

시퀀스에 지정된 요소가 포함되어 있는지 여부를 나타내는 부울 값을 반환합니다.

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
print(cast.contains("Marlon"))    // true
print(cast.contains("James"))    // false

부분 컬렉션 가져오기

prefix(n) / suffix(n)

초기/마지막 요소를 포함하는 지정된 최대 길이까지 시퀀스를 반환

let numbers = [1, 2, 3, 4, 5]
print(numbers.prefix(2))    // [1, 2]
print(numbers.prefix(10))    // [1, 2, 3, 4, 5]
print(numbers.suffix(2))    // [4, 5]
print(numbers.suffix(10))    // [1, 2, 3, 4, 5]

let text = "Hello, World!"
print(text.prefix(3))    //  Hel
print(text.suffix(3))    // ld!

String

lowercased() / uppercased()

문자열을 소/대문자로 변환하면 내보냅니다.

split(separator:)

결과 배열은 최대 maxSplits + 1개의 하위 시퀀스로 구성됩니다. 컬렉션을 분할하는 데 사용되는 요소는 하위 시퀀스의 일부로 반환되지 않습니다.

let line = "BLANCHE:     I don't want realism.   I want magic!"
print(line.split(separator: " "))
// ["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]

components(separatedBy:)

주어진 구분 기호로 나눈 수신자의 부분 문자열을 포함하는 배열을 반환합니다.

let line = "BLANCHE:     I don't want realism.   I want magic!"
print(line.components(separatedBy: " "))
// ["BLANCHE:", "", "", "", "", "I", "don\'t", "want", "realism.", "", "", "I", "want", "magic!"]

Character

isLetter

이 문자가 문자인지 여부를 나타내는 부울 값입니다.

asciiValue

ASCII 문자인 경우 이 문자의 ASCII 인코딩 값을 UInt8로 반환합니다.

isUppercase / isLowercase

대/소문자로 간주할지 여부를 나타내는 부울 값입니다.

isNumber

이 문자가 숫자를 나타내는지 여부를 나타내는 부울 값입니다.

고차함수

  • compactMap
  • flatMap
  • reduce
  • zip

Dictionary

updateValue(:forKey:)

주어진 키에 대해 사전에 저장된 값을 업데이트하거나 키가 존재하지 않는 경우 새 키-값 쌍을 추가합니다.

removeValue(forKey:)

주어진 키와 관련 값을 사전에서 제거합니다.
키가 해시 가능을 준수할 때 사용할 수 있습니다.

keys

사전의 모든 키를 나타내는 컬렉션을 반환합니다.

values

사전의 모든 값들을 나타내는 컬렉션을 반환합니다.

Set

union

이 집합과 주어진 시퀀스의 합집합을 새로운 Set타입으로 반환합니다.

let attendees: Set = ["Alicia", "Bethany", "Diana"]
let visitors = ["Marcia", "Nathaniel"]
let attendeesAndVisitors = attendees.union(visitors)
print(attendeesAndVisitors)
// ["Diana", "Nathaniel", "Bethany", "Alicia", "Marcia"]

intersection

이 집합과 주어진 시퀀스의 교집합을 새로운 Set타입으로 반환합니다.

let employees: Set = ["Alicia", "Bethany", "Chris", "Diana", "Eric"]
let neighbors: Set = ["Bethany", "Eric", "Forlani", "Greta"]
let bothNeighborsAndEmployees = employees.intersection(neighbors)
print(bothNeighborsAndEmployees)
// ["Bethany", "Eric"]

symmetricDifference

이 집합 또는 지정된 시퀀스에 있지만 둘 다에 없는 요소가 포함된 새 집합을 반환합니다.

let employees: Set = ["Alicia", "Bethany", "Diana", "Eric"]
let neighbors = ["Bethany", "Eric", "Forlani"]
let eitherNeighborsOrEmployees = employees.symmetricDifference(neighbors)
print(eitherNeighborsOrEmployees)
// ["Diana", "Forlani", "Alicia"]

isSubset(of:)

이 집합이 주어진 집합의 하위 집합인지 여부를 나타내는 부울 값을 반환합니다.

let employees: Set = ["Alicia", "Bethany", "Chris", "Diana", "Eric"]
let attendees: Set = ["Alicia", "Bethany", "Diana"]
print(attendees.isSubset(of: employees))
// true