[Swift] 알고리즘에 필요한 Swift Basic 총정리

EmilY
9 min readJul 5, 2019

--

Swift로 알고리즘 초초초초보부터 시작해서 정리한 문법들 올립니다

정확하지 않을 수도 있고 불친절하게 정리했습니다

키보드 입력받는 법

let value = readLine()

readLine() 리턴값은 Optional String이다

필요한 데이터에 따라 알아서 가공하기..

키보드 입력받은 값 공백으로 구분하기

입력 : 1 2 3 4 일 경우

첫번째, split()으로 쪼개기

let nums = readLine()!.split(seperator:" ")  // ["1", "2", "3", "4"]

둘째, component()를 이용하는 방법도 있다

let nums = readLine()!.components(seperatedBy:" ") // ["1", "2", "3", "4"]

둘의 차이는 두 가지다

  1. import Foundation

component의 경우 Foundation에 들어있는 instance method여서

반드시 import Foundation을 해줘야 한다

대신 용량이 늘어난다

split의 경우 Swift 기본 instance method여서 Foundation 없이도 사용 가능

그러면 component는 왜 쓸까?

2. 리턴값이 다르다

코드를 넣고 실행시켜보면 위의 이미지처럼 나온다

얼핏 보기엔 다를게 없어보이지만 사실 Type이 다르다

components로 쪼갠 books2는 리턴값이 [String]이고

split으로 쪼갠 books는 리턴값이 [String.SubSequence]다

split으로 쪼개면 바로 String으로 쓸 수 없음..

(그래도 map하면 되니까 백준 문제 풀땐 왠만하면 import 없는 split을 썼다..)

배열(Array) 다루기

알고리즘 문제 풀 때 배열 다룰 일이 너무*1000 많았다

특히 map, filter는 정말 유용하다

  1. 빈 배열 만들기
var empty : [Int] = []
var empty = [Int]()
var empty : Array<Int> = []

2. 임의의 Data 넣어서 만들기

var array = Array(1...5) // [1,2,3,4,5]

3. 크기가 정해진 배열

var arr = Array(repeating: 0, count: 3) // [0,0,0]

4. 2차원 배열(Matrix) 만들기

let matrix = [[Int]]()
let arr: [[Int]] = Array(repeating:Array(repeating:1, count: 5), count: 3) // 안쪽 count가 행, 바깥 count가 열
다룰때는 이렇게
arr[i][j]

5. 배열 거꾸로 출력

array.reversed()

6. 배열 정렬하기

array.sorted() // default는 오름차순 (1,2,3...)array.sorted(by: >) // 내림차순 원할때는 이렇게

7. 배열 다룰때 가장 중요한 세 가지 map, filter, reduce

map

var string = ["1","2","3","4"]
string.map { Int($0)! } // [1,2,3,4] 각 원소를 전부 Int로 맵핑

filter

var array = [1,2,3,4]
array.filter { $0 % 2 == 0 } // [2,4] 조건에 맞는 수만 뽑아냄

reduce

var array = [1,2,3,4]
array.reduce(0, +) // 숫자 합이 나타남. 문자열 합치기도 가능

String, Substring, Index 다루기

let secondIndex = string.index(after: string.startIndex)
let second = string[secondIndex]
let endIndex = string.index(before: str.endIndex)// n번째 문자 index 구하는 법
let index = string.index(string.startIndex, offsetBy: n-1)
// subString 구하는 법
let substring = string[start...end]
// 문자 검색해서 index 찾기
"abc123".index(firstOf: "c")
// 특정 character replace
string.replacingOccurences(of:" ", with:"+")

print할 때 따옴표(‘), 쌍따옴표(“) 출력하기

print("이렇게 \' 써준다") // 결과 : 이렇게 ' 써준다

비트 연산

  1. NOT : ~value // 00001111->11110000 으로. 0과 1을 바꿔준다
  2. AND : first & second // 두 개 자릿수가 둘 다 1일 때 1 리턴
  3. OR : first | second // 둘 중 하나라도 자릿수가 1이면 1 리턴
  4. XOR : first ^ second // 두 자릿수가 다르면 1, 같으면 0 리턴
  5. Left Shift : value << n // n만큼 왼쪽으로 이동하고 빈자리는 0으로 채운다
  6. Right Shift : value >> n // n만큼 오른쪽으로 이동하고 빈자리는 0으로
  7. 3항 연산자 : 조건문 ? 참 : 거짓 // a < b ? a: b 중첩도 가능

앱 종료

exit(0)

무한루프

while true {
...
}

do while문

repeat {
....
} while

Swift에는 ‘++’ 연산자가 없다!! ( 마이너스도 마찬가지)

String 한 글자와 Character 형 구분할 때

Character("a") // 타입 명시

거듭제곱

pow(밑, 지수)  // 밑에는 Decimal 타입이 들어감

Decimal을 Int로

(decimal as NSDecimalNumber).intValue

부동 소수점 다루기

NumberFormatter 이용

let formatter = NumberFormatter()
formatter.roundingMode = .down // 내림
formatter.minFractionDigits = 2 // 2자릿수까지만 표현
formatter.maxFractionDigits = 2
let num = formatter.string(from: NSNumber(value: 2.3243254)) // 2.32

(자세한 글은 : https://medium.com/%40twih1203/swift5-numberformatter%EB%A1%9C-%EC%86%8C%EC%88%98%EC%A0%90-%EC%95%84%EB%9E%98-%EC%9E%90%EB%A6%BF%EC%88%98-%EB%B0%98%EC%98%AC%EB%A6%BC-%EC%97%86%EC%9D%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0-ee33219e3cdd )

타입 범위

Int, Int64 = 2의 8승 - 1 (9223372036854775807) // 19자리
Int32 = 2의 6승 -1 (2147483647) // 10자리
Float = 소수점 6자리까지 표현 가능
Double = 소수점 15자리까지 표현 가능

진수 표현

// 10진수 -> N진법
String(integer, radix: n)
// N진법 -> 10진수
Int("11100110", radix: n)!

문자를 ASCII 코드로 변환

Character("a").asciiValue!

String에 식이 들어있을 때 그대로 계산하기

let mathExpression = NSExpression(format: "3+4+2-1*6")
let mathValue = mathExpression.expressionValue(with: nil, context: nil) as! Int // result : 3

절대값 변환

abs(-29) // 29

for문에서 원하는 수치만큼 증가or감소하는 반복문 필요할 때

stride(from:1, to:5, by:2)       // open range..5 불포함 1,3 까지만
stride(from:1, through:5, by:2) // closed range..5 포함 1,3,5까지

ex)
for even in stride(from:2, through:100, by:2)

Dictionary 사용하기

  1. 생성
var dic: [Int:String] = [:]
var dic = [Int:String]()
var dic = [1:"a", 2:"b", 3:"c"]

2. 값 수정

dic.updateValue("c", forKey:3)
dic[3] = "d"

3. 값 추가

dic[4] = "5"
dic.update("5", forKey: 4) // 4라는 키가 있을 경우 수정이 됨

4. 접근

dic[4]! // Unwrapping을 해준다

5. for문 돌기

for (key, value) in dic {      print(key)            // 1,2,3      print(value)          // a,b,c
}
단, 순서는 뒤죽박죽이다!!!! (Dictionary는 순서가 없음)

6. 값 삭제

dic.removeValue(forKey:4)  // 특정 키값 삭제
dic.removeAll() // 전체 삭제

7. Key를 바꿀 경우, 지우고 다시 넣어줘야 함

8. Dictionary Key로 sort하기

let sort = dic.sorted(by: { $0.key < $1.key }) // value로 sort할 경우 $0.value

정리하는대로 추가합니다

--

--