알고리즘 문제 풀이를 위한 Swift 요약 정리

Updated:

  • 알고리즘 문제를 Swift로 풀면서 알게된 것을 정리하는 노트입니다.
  • 새로운 내용은 이 포스트에 계속 업데이트됩니다.

배열

배열 선언과 동시에 초기화

// 1차원 배열  
var arr = [Int]()
var arr: Array<Int> = []
var arr: [Int] = []

// 2차원 배열  
var arr4 = [[Int]]()

원소와 크기를 지정해서 배열 만들기

var arr = Array(repeating: 1, count: 5) // [1,1,1,1,1]

범위값으로 배열 만들기

var arr = Array(1...3)

배열 정렬

var arr = [1,3,2]

// sort() - 배열이 정렬됨. (원본의 순서 변경)
// sorted() - 배열을 정렬한 배열을 반환. (원본은 변겅없음)
arr.sort()      // 오름차순 [1,2,3]
arr.sort(by: >) // 내림차순 [3,2,1]

배열 다루기

var arr = [1,2,3,4,5]

// 인덱스로 원소 찾기
arr[2] // 3

// 원소로 인덱스 찾기 (옵셔널)
arr.firstIndex(of: 3)! // 2

// 인덱스로 원소 지우기
arr.remove(at: 2) // [1,2,3,5]

// 맨 뒤에 새 원소 추가
arr.append(6) // [1,2,3,5,6]

// 맨 뒤 원소 지우고 반환 (옵셔널 아님 - 배열이 비어있으면 않됨)
arr.removeLast() // [1,2,3,5]

// 특정 인덱스에 원소 넣기
arr.insert(3, at: 2) // [1,2,3,4,5]

// 특정 원소 있는지 확인
arr.contains(3) // true

// 순서 반전
arr.reverse() // [5,4,3,2,1]

// 첫 원소 지우고 반환
arr.removeFirst()

// 첫 원소 반환 (옵셔널)
arr.first!

// 마지막 원소 지우고반환 (옵셔널 - 배열이 비어있으면 nil 반환)
arr.popLast()!

// 마지막 원소 반환 (옵셔널)
arr.last!

// 원소의 최대값, 최소값 (옵셔널)
var min = arr.min()! // 1
var max = arr.max()! // 5

// 모든 원소 지우기
arr.removeAll()

// 조건을 만족하는 모든 원소 지우기 
arr.removeAll(where: {$0 % 2 == 0}) 
//arr.removeAll{$0 % 2 == 0} // 위 코드 함축

// 원소 스왑
arr.swapAt(_:, _:)

map

모든 원소에 적용

var arrStr = ["1", "2", "3"]
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]

reduce

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

배열 순회하기

순회하며 원소 참조

var arr = [1,2,3]
for n in arr {
    print(n)
}

순회하며 원소와 인덱스 참조 - enumerated()

for (index, value) in arr.enumerated() {
    print("\(index), \(value)")
}

인덱스로 순회

var arr = [1, 2, 3]

// count 사용
for i in 0..<arr.count {
    print(arr[i])
}

// indices 사용
for i in arr.indices {
    print(arr[i])
}

역순으로 순회

var arr = [1, 2, 3]

for i in (0..<arr.count).reversed() {
    print(arr[i])
}

for i in arr.indices.reversed() {
    print(arr[i])
}

배열 거꾸로 출력 - revesed()

var arr = [1, 2, 3]
var arrReversed = arr.reversed()

// 순회 참조 가능
for n in arrReversed {
    print(n)
}

//arrReversed[0] // 직접 참조 불가
var arr = [1, 2, 3]
arr.reverse() // 배열 자체를 거꾸로 만들면

// 순회 참조 가능
for n in arr {
    print(n)
}

arr[0] // 직접 참조 가능

문자열

특정 문자 기준으로 분리하기 - split()

var str = "Hello Wolrd! Swift"
var strings = str.split(separator: " ") // 공백 기준으로 분리
print(strings) // ["Hello", "World!", "Swift"]

문자열 배열을 하나의 문자열로 합치기 - 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()

var str = "abcdef"
str.contains("a")  // true
str.contains("ab") // true
str.contains("cd") // true
str.contains("ac") // 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")

비트 연산

2진수로 변환했을 때 1의 갯수

let n: Int8 = 25    // 0b0001_1001
n.nonzeroBitCount   // 3

수학

제곱근 - sqrt()

// Double형 입력받아 Double형 반환
sqrt(4.0) // 2.0

거듭제곱 - pow()

// Double형 입력받아 Double형 반환
pow(2.0, 3.0) // 8.0 // 2의 3승, 2^3

Leave a comment