• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

알고리즘을 위한 Swift 정리

알고리즘 풀이에 자주 쓰이는 Swift 함수 등등 아카이브

✨ 목차 ✨

입출력 배열 map,filter,reduce 문자열 String Character 수학

입출력

사용자 입력 받기

입력이 여러 줄일 땐 readLine을 여러 번 써야 됨

  • 기본 입력
var input = readLine()! // String type
var num = Int(readLine()!)! // Int 형 숫자 한 개 입력 받기
  • 한 줄에 공백과 여러 개의 input이 올 땐 이렇게. string 배열로 바로 mapping된다.
let input = readLine()!.split(separator: " ").map{String($0)}
  • mapping 할 때, Substring에서 Int 로 ( Int($0) )하는 것 보다 Substring → String → Int 로 ( Int(String($0))! ) 하는게 더 빠르다.
var nums = Array(readLine()!).map {Int(String($0))!}

배열

  • 2차원 배열
var arr = [[Int]]()

// 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]
  • 배열 만들기
var arr = Array(repeating: 1, count: 5) // [1,1,1,1,1]
var arr = Array(1...3) // [1,2,3]
  • 배열 정렬
arr.sort() // 원본 순서 변경 (오름차순) [1,2,3]
arr.sorted() // 정렬한 배열을 반환
arr.sort(by: >) // 원본 순서 변경 (내림차순) [3,2,1]
  • 인덱스에 따라 원소 다루기
arr.firstIndex(of: 3)! // 해당 원소 처음 만나는 인덱스 찾기
arr.remove(at: 2) // 해당 인덱스 원소 지우기
arr.append(6) // 맨 뒤에 새 원소 추가
arr.removeFirst() // 맨 앞 원소 지우고 반환
arr.removeLast() // 맨 뒤 원소 지우고 반환 (옵셔널 아님:원본 배열 비어있으면 절대 안 됨)
arr.popLast()! // 맨 뒤 원소 지우고 반환 (옵셔널)
arr.insert(3, at: 2) // 특정 인덱스(2)에 원소(3) 넣기
arr.contains(3) // 특정 원소 있는지 확인 (true/false)
arr.reverse() // 순서 반전
arr.first! // 첫 원소 반환
arr.removeAll() // 모든 원소 지우기
arr.removeAll(where: { $0 % 2 == 0}) // 조건을 만족하는 모든 원소 지우기
arr.swapAt(_:, _:) // 원소 스왑
  • 최대값, 최소값
var min = arr.min()!
var max = arr.max()!
  • 순회하며 원소와 인덱스 참조 - enumerated()
for (index, value) in arr.enumerated() {
    print("\(index), \(value)")
}
  • 인덱스로 순회 (정방향, 역방향)
// 정방향
// count 사용
for i in 0..<arr.count {
    print(arr[i])
}

// indices 사용
for i in arr.indices {
    print(arr[i])
}
// 역방향
for i in (0..<arr.count).reversed() {
    print(arr[i])
}

for i in arr.indices.reversed() {
    print(arr[i])
}
// 아니면 배열 자체를 뒤집고 정방향 순회 해도 됨
  • 배열 각 요소의 수 세기(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

모든 원소에 적용

var arrInt = arrStr.map { Int($0)! } // [1,2,3] 원소를 모두 Int형으로 변환

filter

조건이 참인 원소만 필터링

var arr = [1,2,3,4,5]
var arrEven = arr.filter { $0 % 2 == 0 } // [2, 4]
var arrOdd = arr.filter { $0 % 2 == 1 } // [1, 3, 5]
  • 배열 특정 요소 개수 세기
let arr = ["D", "D", "R", "D"] 
arr.filter { $0 == "D" }.count // 3

reduce

  • sum
var arr = [1, 2, 3]
arr.reduce(0, +) // 6 // 모든 원소 더하기 (0은 초기값)
arr.reduce(0, -) // -6 // 모든 원소 빼기

String

  • ch를 cnt만큼 반복한 String 만들기
String(repeating: ch, count: cnt)
  • String을 한 자리씩 array로 split 하기
for i in str.indices {
    print(repeatString[i]) // 한 줄에 한 글자씩 print됨
}
  • 특정 문자 기준으로 분리하기 - split()
var strings = str.split(separator: " ") // 공백 기준으로 분리
  • 문자열 배열을 하나의 문자열로 합치기 - joined()
let arrHello = ["Hello", "World", "!"]
var hello = arrHello.joined() // "HelloWorld!"
hello = arrHello.joined(separator: " ") // Hello World !
hello = arrHello.joined(separator: ", ") // Hello, World, !
  • 대,소문자 변경 - capitalized, uppercased(), lowercased()
var str = "abcdef"
str = str.capitalized  // 첫번째만 대문자로 변경 "Abcdef"
str = str.uppercased() // 전체 대문자로 변경 "ABCDEF"
str = str.lowercased() // 전체 소문자로 변경 "abcdef
  • 문자열 포함 체크 - contains()
str.contains("a")  // true/false
  • 특정 문자를 다른 문자로 변경한 문자열 반환
var str2 = str.replacingOccurrences(of: "a", with: "b")
print(str)  // 원본에 영향 없음
print(str2) // bbcdef
  • String 인덱스 다루기
var str = "abcdef"

// 문자열 원소 접근
//str[0] // 직접 접근 안됨. String 인덱스로 접근해야함
str[str.startIndex] // "a"

// 3번째 문자 가져오기
let index = str.index(str.startIndex, offsetBy: 3 - 1)
str[index] // "c"

// 일정 범위의 문자열만 가져오기
let sub = str[str.startIndex...index] // "abc"

// 특정 원소의 인덱스
str.firstIndex(of: "c")
  • 문자열 자르기
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)

Character

아스키 코드

let asciiNum = Character(input[0]).asciiValue!

수학

sqrt(4.0) // 제곱근(2.0) // Double 입력, Double 반환
pow(2.0, 3.0) // 거듭제곱(8.0(2^3)) // Double 입력, Double 반환
String(format: "%.2f", value) // 소수점 아래 자리수 제한, String 반환
abs(-11) // 11, 절대값
ceil(6.3) // 7.0 // 올림
floor(4.3) // 4.0 // 내림
round(5.5) // 6.0 // 반올림

🔗 출처

kyungminleedev thoonk