배열과 문자열

인생노잼시기·2021년 5월 20일
0

😨코딩테스트

목록 보기
5/18

내장함수

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

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

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

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)
}

3052

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

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

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)%")
}

https://soll4u.tistory.com/category/알고리즘
참고 블로그

profile
인생노잼

0개의 댓글