[Swift] Problem Solving with Swift
Swift for 코딩테스트
본 포스팅은 Swift로 코딩 테스트를 볼 때 활용할 메서드, 팁 등을 정리해 놓은 포스트입니다.
제가 코딩 테스트를 볼 때 참고하려 작성했지만, 다른 분들에게도 도움이 되면 좋겠다는 마음에 블로그에 정리해서 올리게 되었습니다.
문자열 String
joined
let strArray = ["hello", "world", "!!"]
let str1 = strArray.joined() // "helloworld!!"
let str2 = strArray.joined(separator: " ") // "hello world !!"
알파벳 소문자 대문자 변환
let str = "abcde"
let str1 = str.capitalized // 첫 문자만 대문자로 변경 "Abcde"
let str2 = str.uppercased() // 전체를 대문자로 변경 "ABCDE"
let str3 = str.lowercased() // 전체를 소문자로 변경 "abcde"
문자열 치환
let str = "abcde"
let str2 = str.replacingOccurrences(of: "e", with "a")
// str2 -> "abcda"
포함 여부 확인
let str = "abcde"
print(str.contains("f")) // false
print(str.contains("b")) // true
print(str.contains("abc")) // true
print(str.contains("cdef")) // false
특정 문자를 기준으로 배열화
var str = "abc def ghi"
var answer = str.split(separator: " ") // [Substring]으로 리턴
var answer2 = str.components(separatedBy: " ") // [String]으로 리턴
// ["abc", "def", "ghi"]
문자열 인덱싱
- 스위프트는 파이썬과 다르게 간편한 문자열 인덱싱 (ex.
stirng[3]
)을 제공하지 않음 - 타입 변화 주의
String
타입Character
타입Substring
타입
let str = "Hello World"
// 첫번째 인덱스 문자 가져오기
let firstIndex = str.startIndex
print(str[firstIndex]) // H (Character 타입)
// 마지막 인덱스 문자 가져오기
let endIndex = str.index(before: string.endIndex)
print(str[endIndex]) // ! (Character 타입)
// 인덱스 n의 문자 가져오기
let n = 4
var index = string.index(string.startIndex, offsetBy: n)
print(str[index]) // o (Character 타입)
print(String(string[index])) // o (String 타입)
// 일정 범위의 문자열만 가져오기
let idx1 = str.index(str.startIndex, offsetBy: 1)
let idx2 = str.index(str.startIndex, offsetBy: 4)
let substr = str[idx1...idx2]
let strBySubstr = String(substr)
print(substr) // ello (Substring 타입)
print(strBySubstr) // ello (String 타입)
지정한 문자 개수만큼 출력
let str = "Hello World"
// 시작 기준으로 지정한 문자 개수 출력
let startString = str.prefix(3)
print(startString) // Hell (Substring 타입)
// 종료 기준으로 지정한 문자 개수 출력
let endString = str.suffix(4)
print(endString) // orld (Substring 타입)
let overIndex1 = str.prefix(100)
let overIndex2 = str.suffix(100)
print(overIndex1) // Hello World
print(overIndex2) // Hello World
- 문자열의 인덱스보다 큰 수를 넣어도 인덱스 에러가 나지 않음
배열 Array
인덱싱
var arr = [1, 2, 3, 4, 5, 6, 7]
print(arr[1...3]) // [2, 3, 4]
정렬
var arr = [1, 3, 2, 4]
arr.sort() // 원본 배열을 정렬
let arr2 = arr.sorted() // 원본 배열을 두고 정렬된 배열 반환
- 스위프트는 파이썬과 마찬가지로 기본
sort()
메서드는 Tim Sort 알고리즘을 활용하였다.- Tim Sort : Insertion Sort와 Merge Sort가 합쳐진 정렬 알고리즘
- 평균 시간 복잡도가 O(nlogn)이 나오는 안정적인 정렬 알고리즘
원소와 인덱스
var arr = [1, 2, 3, 3, 4]
// 인덱스로 원소 확인
print(arr[2]) // 3
// 원소로 인덱스 확인
print(arr.firstIndex(of: 3)) // Optional(2)
firstIndex
메서드- 옵셔널 타입으로 인덱스값 반환
- 같은 원소가 다른 인덱스에 있을 때 첫번째 원소의 인덱스만 리턴
첫번째, 마지막 원소
var arr = [1, 2, 3, 3, 4]
// 첫번째 원소
print(arr.first) // Optional(4)
// 첫번째 원소 리턴 후 제거 (popleft)
print(arr.removeFirst) // 1 / [2, 3, 3, 4]
// 마지막 원소
print(arr.last) // Optional(4)
// 마지막 원소 리턴 후 제거 (pop)
print(arr.popLast()) // Optional(4) / [1, 4, 2, 3]
- 옵셔널을 리턴하는 메서드와 아닌 메서드 주의
고차 함수
map
var strArr = ["1", "2", "3", "4"]
var intArr = strArr.map { Int($0)! } // [1, 2, 3, 4]
filter
var arr = [1, 2, 3, 4]
var evenArr = arr.filter { $0 % 2 == 0 } // [2, 4]
reduce
var array1 = ["1","2","3","4"]
var array2 = [1, 2, 3, 4]
// 첫번째 파라미터를 기준으로 두번째 파라미터를 연산함
var arr1 = array1.reduce("", +)// 문자열 합
// "" + "1" + "2" + "3" + "4"
var arr2 = array2.reduce(0, +) // 숫자 합
// 0 + 1 + 2 + 3 + 4 + 5
print(arr1) // 1234
print(arr2) // 10
반복
for문
// 1이상 5미만의 수를 2씩 건너 뛰며
for i in stride(from: 1, to: 5, by: 2) {
print(i) // 1, 3
}
// 1이상 5이하의 수를 2씩 건너 뛰며
for i in stride(from:1, through:5, by:2) {
print(i) // 1, 3, 5
}
// 5이하 1이상의 수를 -1씩 건너 뛰며
for i in stride(from:5, through:1, by:-1) {
print(i) // 5, 4, 3, 2, 1
}