본문 바로가기

Algorithm

알고리즘에 많이 사용되는 Swift Basic

728x90

알고리즘을 스위프트로 풀기로 다짐하고 한 문제 풀어보았는데.. 생각보다 문법이 바로 생각나지 않아서 조금 충격 먹고 정리해보는 알고리즘 용 스위프트 문법 정리를 해봅시다!! 🤔 (이게 다 아닐 수도 있고 완전 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로 작성하면 됩니다.