기본적인 Algorithm 입력값을 받는 작업중에
let line = readLine()!.map{Int($0)!}
Cannot convert value of type 'String.Element' (aka 'Character') to expected argument type 'String’
오류가 떴다.
사실 String()으로 감싸서 형변환하면 되는거긴 하지만 근본적으로 왜 이런 오류가 떴는지 궁금해졌다.
일단 알아둬야 할 것은 String.Element == Character
는 Int
로 바로 형변환할 수 없다.
하지만 split(separator: )
함수를 통한 형변환은 가능한데, 그 이유는 String.Element
가 반환되는 것이 아닌 String.Subsequence
가 반환되기 때문이다.
그렇기 때문에 아래 2가지 방법으로 오류가 난 코드를 바꿀 수 있다.
1. let line = readLine()!.split(separator: " ").map{Int($0)!}
2. let line = readLine()!.map{Int(String($0))!}
추가적으로, 문자열 입력 받는 과정에서 자주 쓰이는 split과 components도 비교해보았다.
가장 큰 차이점은 String기준,
또한, components함수는 Foundation프레임워크에 속해있어, import Foundation이 필요하다.
그렇다면, 또 여기서 split이 반환하는 String.Subsequence
는 무엇일까.
Substring이라고도 불리는데, 새로운 메모리를 할당하지 않고, 기존 String의 메모리를 재사용한다고 한다.
그렇기 때문에 메모리 비용을 절약할 순 있지만, 원본 문자열의 메모리를 참조하는 것이기 때문에 계산을 할 때는 시간이 늦어질 수 있다고 한다.
그래서 사실,,
1. let line = readLine()!.split(separator: " ").map{Int($0)!}
2. let line = readLine()!.split(separator: " ").map{Int(String($0))!}
1번보다 2번 코드가 훨씬 빨랐는데.. 현재 구글링해보니 Swift5.5부터는 파싱 방식이 통합되어서 아예 똑같다고한다.
근데 백준에서는 아직 Swift 5.3버전을 사용하고 있으므로 2번 방식을 조금 더 사용하도록 하자.
참조.
[Swift] 이제는 Int(String(Substring))과 Int(Substring) 비교가 의미 없는 이유