알고리즘을 스위프트로 풀기로 다짐하고 한 문제 풀어보았는데.. 생각보다 문법이 바로 생각나지 않아서 조금 충격 먹고 정리해보는 알고리즘 용 스위프트 문법 정리를 해봅시다!! 🤔 (이게 다 아닐 수도 있고 완전 100% 정답이 아닐 수 있습니다. 만약 잘못된 부분이 있다면 알려주세요.)
키보드 입력 받기
먼저 가장 중요한 입력값 받기 (이 부분은 사실 생략 가능할지도)
let input = readLine()
readLine()의 반환 값은 Optional String입니다. 강제 언래핑도 가능하지만, if let으로 옵셔널 하는 것이.. 더 좋은 것 같은 느낌이 드네요.. (논리적인 이유는 모르겠습니다.)
키보드로 입력받은 값을 공백으로 구분하기
예를 들어 입력 값이 1 2 3 4 일 경우 바로 input으로 데이터를 사용하려고 하면, "1 2 3 4"의 형태이므로 이를 쪼개서 사용해야 합니다.
1. split() 사용하기
let nums = readLine()!.split(seperator: " ")
위에서 옵셔널 바인딩 사용하자고 하고 언래핑하는 언행불일치 ㅋ ㅋ
2. component() 사용하기
let nums = readLine()!.components(seperatedBy:" ")
두 가지 방법의 차이는 import Foundation의 유무에 따른 용량의 차이 / 반환 값의 차이입니다.
split의 경우 스위프트 기본 instance method이므로 Foundation 없이도 사용이 가능합니다. 그런데 왜 component를 쓰느냐? split의 경우 반환 값이 String.SubSequence이므로 쪼갠 뒤에 바로 String으로 사용할 수 없습니다.
(물론 이 경우에 대해서, map 함수를 사용해서 해결할 수 있습니다.)
배열
알고리즘 문제에서 배열을 많이 다루게 됩니다. (배열을 다룰 때 가장 많이 사용하는 함수는 map, filter 함수입니다.)
배열 만들기
- 빈 배열 만들기
var empty : [Int] = []
var empty = [Int]()
var empty : Array<Int> = []
- 임의의 데이터 넣어서 배열 만들기
var empty : [Int] = []
var empty = [Int]()
var empty : Array<Int> = []
- 크기가 정해진 배열 만들기
var arr = Array(repeating: 1, count: 3) // [1, 1, 1]
- 2차원 배열 만들기
let matrix = [[Int]]()
let arr: [[Int]] = Array(repeating:Array(repeating:1, count: 5), count: 3)
// [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
// 해당 2차원 배열에 대해서 값에 접근하거나 다룰 때는 arr[i][j]로 접근할 수 있습니다.
배열 다루기 (= 조작하기)
- 배열 거꾸로 출력
array.reversed()
- 배열 정렬하기
array.sorted() // 오름차순 (기본값)
array.sorted(by: >) // 내림차순
- 배열을 다루는 3 대장
map, filter, reduce
1. map
var string = ["1","2","3","4"]
string.map { Int($0)! }
// [1, 2, 3, 4] 각 원소를 모두 Int형으로 맵핑
2. filter
var array = [1,2,3,4]
array.filter { $0 % 2 == 0 }
// [2,4] 조건에 맞는 수만 걸러냄
3. reduce
var array = [1,2,3,4]
array.reduce(0, +)
// 배열 안 숫자들의 합인 10 결과값 도출, 문자열을 합치는 것도 가능함
String, Substring, Index
// 2번째 문자 구하는 법
let secondIndex = string.index(after: string.startIndex)
let second = string[secondIndex]
// 마지막 인덱스 구하는 법
let endIndex = string.index(before: str.endIndex)
// n번째 문자 인덱스 구하는 법
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
2. AND : first & second
3. OR : first | second
4. XOR : first ^ second
5. Left Shift : value << n // n만큼 왼쪽으로 이동 후 빈자리는 0으로 채웁니다.
6. Right Shift : value >> n // n만큼 오른쪽으로 이동하고 빈자리는 0으로 채웁니다.
7. 3항 연산자 : 조건문 ? 참 : 거짓
무한루프
while true {
...
}
do while 문
repeat {
....
} while
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]!
5. for문으로 배열의 값 접근
for (key, value) in dic {
print(key) // 1,2,3
print(value) // a,b,c
}
// 딕셔너리는 순서가 없기 때문에 출력되는 값이 랜덤입니다.
6. 값 삭제
dic.removeValue(forKey:4) // 특정 키값 삭제
dic.removeAll() // 전체 삭제
7. 딕셔너리 키로 sort 하기
let sort = dic.sorted(by: { $0.key < $1.key })
// value로 sort할 경우 $0.value로 작성하면 됩니다.
'Algorithm' 카테고리의 다른 글
프로그래머스 - 두 개 뽑아서 더하기 (0) | 2022.04.12 |
---|---|
BST(이진 탐색 트리) - 구현 (0) | 2022.04.01 |
BST (이진탐색트리) - 개념 (0) | 2022.04.01 |
시간 복잡도 (+빅오 표기법) / 공간 복잡도 (0) | 2022.03.30 |
Swift Algorithm (0) | 2022.03.30 |