[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
}

참고

개발자 찬히히 Blog
ungchun.log






© 2021. by hminkim