코딩테스트를 스위프트로 준비하면서 자주 검색하거나 사용하는 문법들을 정리해보려 합니다. 계속 추가하고 수정할 예정입니다.
// return String
var input = readLine()!
// return Int
var input = Int(readLine()!)!
// split - return: [SubString]
var nums = readLine()!.split(separator: " ").map {Int($0)!}
// components - return: [String] -> import Foundation 필수
var nums = readLine()!.components(separatedBy: " ").map {Int($0)!}
// FileIO, 입력받으면서 리스트에 바로 추가하기
array.append((file.readInt(), file.readInt()))
// Int
var nums = Array(readLine()!).map {Int(String($0))!}
// String
var nums = Array(readLine()!).map {String($0)}
// FileIO
let nums = [file.readInt(), file.readInt()]
보통 입출력이 10~20만 줄 넘어가면 쓰는걸 추천
xcode 터미널에서 엔터가 아닌 EOF를 입력해야 입력 완료가 된다. 터미널에서 값을 입력한 뒤 제일 마지막에 Ctrl + D를 입력하면 출력값이 나온다.
let strData = "hello성훈!!"
// [prefix : 시작 기준으로 지정한 문자 개수 출력]
let startData = strData.prefix(5)
print(startData) // hello
// [suffix : 종료 기준으로 지정한 문자 개수 출력]
let endData = strData.suffix(4)
print(endData) // 성훈!!
let numbers = [1, 2, 3, 4, 5]
print(numbers.prefix(2))
// Prints "[1, 2]"
print(numbers.prefix(10))
// Prints "[1, 2, 3, 4, 5]"
let numbers = [1, 2, 3, 4, 5]
print(numbers.suffix(2))
// Prints "[4, 5]"
print(numbers.suffix(10))
// Prints "[1, 2, 3, 4, 5]"
/// 기준이 되는 문자를 제외한 요소를 배열로 만들어 리턴
let dartResult = "1S2D*3T"
var scores = dartResult.split(whereSeparator: {!$0.isNumber}).map {Int($0)!}
print(scores)
// Prints "[1, 2, 3]"
let letters = dartResult.split(whereSeparator: {$0.isNumber})
print(letters)
// Prints "["S", "D*", "T"]"
// 3번째부터 끝까지
let startIdx: String.Index = str.index(str.startIndex, offsetBy: 3)
var result = String(str[startIdx...])
// 처음부터 3번째까지
let endIdx: String.Index = str.index(str.startIndex, offsetBy: 3)
var result = String(str[...endIdx])
let str = String(repeating: "ㅋ", count: 10)
print(str) // "ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ"
// import Foundation 필수
let str = "ung!chun!"
let str2 = str.replacingOccurrences(of: "!", with: "?")
print(str2) // ung?chun?
print("Hello", terminator:"")
let nums: [Int] = [1, 2, 3, 4]
nums.forEach {
print($0) // 1 2 3 4
}
// 3 6 9
for i in stride(from: 3, to: 12, by: 3) {
print(i)
}
// 3 6 9 12
for i in stride(from: 3, through: 12, by: 3) {
print(i)
}
// 11
abs(-11)
let value = 3.0
// 9.0
pow(value, 2)
let value = 9.0
// 3.0
sqrt(value)
// n = 123, return = 6
String(n).map{ String($0)}.reduce(0){ $0 + Int($1)! }
var array = [1, 2, 3, 4, 5]
// [2, 3, 4]
array[1...3]
var array = [1, 2, 3]
array.append(4) // [1, 2, 3, 4]
array.append(contentsOf: [5, 6, 7]) // [1, 2, 3, 4, 5, 6, 7]
if let index = array.firstIndex(where: {$0 == value}) {
array.remove(at: index)
}
let arr = [Int]()
let arr = Array(repeating: 0, count: 5)
let arr = [Int](repeating: 0, count: 5)
let arr = [[Int]]()
let arr = Array(repeating: Array(repeating: 0, count: 3), count: 5)
let arr = [[Int]](repeating: [Int](repeating: 0, count: 3), count: 5)
var string = ["1","2","3","4"]
// [1,2,3,4] 각 원소를 전부 Int로 맵핑
string.map { Int($0)! }
var array = [1,2,3,4]
// [2,4] 조건에 맞는 수만 뽑아냄
array.filter { $0 % 2 == 0 }
// 초깃값이 3이고 정수 배열의 모든 값을 더하는 코드
let numbers: [Int] = [1, 2, 3]
var sumFromThree: Int = numbers.reduce(3) {
print("\($0) + \($1)")
// 3 + 1
// 4 + 2
// 6 + 3
return $0 + $1
}
print(sumFromThree) // 9
// 간단하게는 이렇게도 가능하긴함
var array = [1,2,3,4]
// 숫자 합이 나타남. 문자열 합치기도 가능
array.reduce(0, +)
// 문자열 합치기는 joined()를 사용하자. reduce가 훨씬 느림
joined는 배열의 문자열들을 하나의 문자열로 반환하는 것이기 때문에 배열의 요소들이 문자열 이어야 합니다.
var brands = ["Dell", "HP", "Apple"]
// DellHPApple
var result1 = brands.joined()
// Dell HP Apple
var result2 = brands.joined(separator:" ")
// Dell, HP, Apple
var result3 = brands.joined(separator:", ")
// 만약 문자열이 아니라면 문자열로 바꾸고 진행해야함
var result: [Int] = [1, 2, 3, 4]
result.map{String($0)}.joined() // [1, 2, 3, 4] -> 1234
result.map{String($0)}.joined(separator: ", ") // [1, 2, 3, 4] -> 1, 2, 3, 4
let array1 = [1, nil, 3, nil, 5, 6, 7]
let flatMapTest1 = array1.flatMap{ $0 }
let compactMapTest1 = array1.compactMap { $0 }
// flatMapTest1 : [1, 3, 5, 6, 7]
// compactMapTest1 : [1, 3, 5, 6, 7]
let array2: [[Int?]] = [[1, 2, 3], [nil, 5], [6, nil], [nil, nil]]
let flatMapTest2 = array2.flatMap { $0 }
let compactMapTest2 = array2.compactMap { $0 }
// flatMapTest2 : [Optional(1), Optional(2), Optional(3), nil, Optional(5), Optional(6), nil, nil, nil]
// compactMapTest2 : [[Optional(1), Optional(2), Optional(3)], [nil, Optional(5)], [Optional(6), nil], [nil, nil]]
let array2: [[Int?]] = [[1, 2, 3], [nil, 5], [6, nil], [nil, nil]]
let flatMapTest2 = array2.flatMap { $0 }.compactMap{ $0 }
// flatMapTest2 : [1, 2, 3, 5, 6]
let array3 = [[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]]
let flatMapTest3 = array3.flatMap { $0 }
// [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
let doubleflatMapTest3 = flatMapTest3.flatMap { $0 }
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 생성
var tempSet: Set<Int> = []
var tempSet = Set<Int>()
var tempSet: Set<Int> = [1, 2, 5, 0]
let count: Int = tempSet.count // Set 갯수 확인 : 4
let isEmpty: Bool = tempSet.isEmpty // Set 비었는지 확인 : false
tempSet.contains(1) // true
tempSet.contains(10) // false
// insert : 값을 추가하고, 추가된 결과를 튜플로 리턴 (중복이면 false, 추가된 값)
tempSet.insert(1) // (false, 1)
tempSet.insert(10) // (true, 10)
// update : 값이 존재하지 않으면 추가 후 nil 리턴, 존재할 경우 덮어쓰기 후 덮어쓰기 전 값 리턴
tempSet.update(with: 1) // Optioanl(1)
tempSet.update(with: 120) // nil
// remove() : 한 가지 요소 삭제할 때 사용, 삭제 후 삭제한 값 return (없는 요소 삭제 시 nil 리턴)
tempSet.remove(1) // Optional(1)
tempSet.remove(10) // nil
// removeAll() : 전체 요소 삭제
tempSet.removeAll()
// 생성
var dict: [String: Int] = [:]
var dict = [String: Int]()
// 갯수 확인
let count: Int = dict.count
let isEmpty: Bool = dict.isEmpty
var dict = ["height": 165, "age" : 100]
let height = dict["height"] // Optional(165)
let weight = dict["weight"] // nil
dict["weight"] = 100 // 해당 Key가 없다면, 추가 (insert)
dict["height"] = 200 // 해당 Key가 있다면, Value 덮어쓰기 (update)
dict["weight"] = nil // 해당 Key가 없어도 에러 안남
dict["height"] = nil // 해당 Key가 있다면, 해당 Key-Value 삭제
dict.removeAll() // 전체 삭제
dict.keys // "height, "age"
dict.keys.sorted() // "age", "height
dict.values // 165, 100
dict.values.sorted() // 100, 165
dict.sorted(by: {$0.value > $1.value})
dict.filter(condition) // 해당 클로저를 만족하는 요소만 모아서 새 딕셔너리로 리턴
var v = [[Int]]()
var xDic = [Int: Int]()
xDic[v[i][0]]
let x = xDic.filter {$0.value < 2}.keys
ans.append(contentsOf: xDic.values.filter {$0 < 2})
var arr = [[0, 3], [1, 9], [2, 6]]
let sortedArray = arr.sorted(by: {$0[1] < $1[1] }) // 각 배열 두 번째 수 기준으로 오름차순
let sortedArray = arr.sorted(by: {$0.1 < $1.1 }) // 같은 결과
print(sortedArray) // [[0, 3], [2, 6], [1, 9]]
// 수박수박수박수박
let watermelon4 = String(repeating: "수박", count: 4)
print(watermelon4)
// [false, false, false, false, false]
let liar = Array(repeating: false, count: 5)
print(liar)
배열안에 담긴 숫자만큼 일일이 print하면 매번 print하는 것도 상당히 느리기때문에 시간초과 되는 경우가 많은데 String - init ( repeating: count: ) 로 한번에 만들어서 String에 저장해서 출력하면 시간초과를 막을 수 있다. -> 수 정렬하기 3 참고
var answer = ""
// \n 이용해서 한 줄에 하나씩 출력
answer += String(repeating: "\(value)\n", count: countValue)
// 공백 이용해서 한 줄에 띄어서 출력
answer += String(repeating: "\(value) ", count: countValue)
// 한 줄에 붙여서 출력
answer += String(repeating: "\(value)", count: countValue)
print(answer)
// 최대공약수
func GCD(_ a: Int, _ b: Int) -> Int {
let mod: Int = a % b
return 0 == mod ? min(a, b) : GCD(b, mod)
}
// 최소공배수
func LCM(_ a: Int, _ b: Int) -> Int {
return a * b / GCD(a, b)
}
순열과 조합