내장함수
var names: Array<String> = ["yagom", "chulsoo", "younghee", "yagom"] //var names: [String] = ["yagom", "chulsoo", "younghee", "yagom"] // 위와 동일한 표현 [String], Array<String>
var emptyArray: [Any] = [] //var emptyArray: [Any] = [Any]() //var emptyArray: [Any] = Array<Any>() //위와 동일한 표현들 print(emptyArray.isEmpty) //true print(names.count) //4
names.append("elsa") names.append(contentsOf: ["john", "max"]) names.insert("happy", at: 2) //["yagom", "chulsoo", "jenny", "yagom", "elsa", "john", "max"] print(names) //["yagom", "chulsoo", "happy", "jenny", "yagom", "elsa", "john", "max"]
print(names.firstIndex(of: "yagom")) //Optional(0) print(names.firstIndex(of: "christal")) //nil print(names.first) //Optional("yagom") print(names.last) //Optional("max")
let firstItem: String = names.removeFirst() //let firstItem: String = names.removeLast() print(firstItem) //yagom let indexZeroItem: String = names.remove(at: 0) print(indexZeroItem) //chulsoo print(names[1 ... 3]) //["jenny", "yagom", "elsa"]
10818
배열의 최솟값과 최댓값 구하기
시간초과
import Foundation
let number = Int(readLine()!)!
let intArr = readLine()!.components(separatedBy: " ").map( {Int($0)!} )
print("\(intArr.min()!) \(intArr.max()!)")
let N = Int(readLine()!)!
let numsArr = readLine()!.split(separator:" ").map{Int(String($0))!}
print(numsArr.min()!, numsArr.max()!)
Int(String($0))! 이 더 빠르다고 한다...
이게 통과됐는데... 왜why죠?
IntegerParsing 내부 코드를 살펴보면
https://github.com/apple/swift/blob/main/stdlib/public/core/IntegerParsing.swift
String일 때만 FastUTF8로 변환되기 때문이다
String인 경우 FastUTF8로 변환된 후 Int로 변환하면 FastUTF8로 변환하기 때문에 빠르다고 한다.
Int인 경우에는 _parseASCIISlowPath를 거치는데 말만 들어도 느리쥬?
@inlinable // @specializable
@_semantics("optimize.sil.specialize.generic.partial.never")
public init?<S: StringProtocol>(_ text: S, radix: Int = 10) {
_precondition(2...36 ~= radix, "Radix not in range 2...36")
if let str = text as? String, str._guts.isFastUTF8 { //String일 때는 FastUTF8로 변환되기 때문이다
guard let ret = str._guts.withFastUTF8 ({ utf8 -> Self? in
var iter = utf8.makeIterator()
return _parseASCII(codeUnits: &iter, radix: Self(radix))
}) else {
return nil
}
self = ret
return
}
// TODO(String performance): We can provide fast paths for common radices,
// native UTF-8 storage, etc.
var iter = text.utf8.makeIterator()
guard let ret = Self._parseASCIISlowPath(
codeUnits: &iter, radix: Self(radix)
) else { return nil }
self = ret
}
갑자기 split이랑 components랑 궁금해져서 찾아봤다
https://velog.io/@minni/Swift-split-VS-components
split이 더 빠르다고 하네...
2562
append 사용해보기
최댓값 구하기
import Foundation
var intArray: [Int] = []
for _ in 1 ... 9 {
let intVal = Int(readLine()!)!
intArray.append(intVal)
}
var max: Int = 0
var maxIndex: Int = 0
for i in 0 ... 8 {
if intArray[i] > max {
max = intArray[i]
maxIndex = i+1
}
}
print(max)
print(maxIndex)
2577
1차원 배열 초기화하는 방법: [Int](repeating: 0, count: 5)
배열 출력하기 forEach 사용하기
import Foundation
var a = Int(readLine()!)!
var b = Int(readLine()!)!
var c = Int(readLine()!)!
var num = a*b*c
let numToString = String(num)
var countArray = [Int](repeating: 0, count: 10) //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for _ in 1 ... numToString.count {
let index = num%10
countArray[index] += 1
num /= 10
}
countArray.forEach {
print($0)
}
2577
1차원 배열 초기화하는 방법:
[Int](repeating: 0, count: 5)
[Int].init(repeating: 0, count: 5)
배열 출력하기 forEach 사용하기
import Foundation
var a = Int(readLine()!)!
var b = Int(readLine()!)!
var c = Int(readLine()!)!
var num = a*b*c
let numToString = String(num)
var countArray = [Int](repeating: 0, count: 10) //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for _ in 1 ... numToString.count {
let index = num%10
countArray[index] += 1
num /= 10
}
countArray.forEach {
print($0)
}
8958
입력값
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX
split과 components 비교하기
확연한 차이점은 components는 값이 없을 때도 ""를 리턴한다는 것이다
split은 Foundation을 import하지 않아도 사용가능하다
import Foundation
var testCase = Int(readLine()!)!
for _ in 1 ... testCase {
let stringArr = readLine()!.split(separator: "X").map( {String($0)} )
print(stringArr)
}
["OO", "O", "OOO"]
["OO", "OO", "OO"]
["O", "O", "O", "O", "O", "O", "O"]
["OOOOOOOOOO"]
["OOOO", "OOOO", "OOOO"]
import Foundation
var testCase = Int(readLine()!)!
for _ in 1 ... testCase {
let stringArr = readLine()!.components(separatedBy: "X")
print(stringArr)
}
["OO", "", "O", "", "OOO"]
["OO", "", "OO", "", "OO"]
["O", "O", "O", "O", "O", "O", "O", ""]
["OOOOOOOOOO"]
["OOOO", "OOOO", "OOOO", ""]
import Foundation
var testCase = Int(readLine()!)!
for _ in 1 ... testCase {
let stringArr = readLine()!.split(separator: "X").map( {String($0)} )
var sum = 0
for i in 0 ... stringArr.count-1 {
var addNum = 0
for j in 1 ... stringArr[i].count {
addNum += j
}
sum += addNum
}
print(sum)
}
//런타임에러나네...😵💫
구글링해서 찾아낸 답변
import Foundation
var testCase = Int(readLine()!)!
for _ in 1 ... testCase {
var (s, c) = (0, 0)
let quiz = readLine()!
for i in quiz {
if (i == "O") {
s += c + 1
c += 1
} else {
c = 0
}
}
print(s)
}
4344
평균값 구하기
// 학생의 수(student)와 stu명의 점수(score)가 주어진다
let arr = readLine()!.split(separator: " ").map{Int(String($0))!}
// 첫 수는 stu에, 나머지 점수는 sco에 저장
let (stu, sco) = (arr[0], arr[1..<arr.endIndex])
arr.endIndex 이런 것두 있구나
import Foundation
let testcase = Int(readLine()!)!
for _ in 1 ... testcase {
let line = readLine()!.split(separator: " ", maxSplits: 1, omittingEmptySubsequences: true)
let numberOfStudents = Int(line[0])!
let score = line[1].split(separator: " ").map() { (Int(String($0))!) }
var average = 0
var sum = 0
for i in score{
sum += i
}
average = sum / numberOfStudents
var count = 0
for i in score {
if i > average {
count += 1
}
}
let answer = String(format: "%.3f", Double(count)/Double(numberOfStudents)*100)
print("\(answer)%")
}