About ReadLine() in Algorithm

Choong Won, Seo·2024년 2월 15일
1

백준

목록 보기
27/30
post-thumbnail

기본적인 Algorithm 입력값을 받는 작업중에

let line = readLine()!.map{Int($0)!}

Cannot convert value of type 'String.Element' (aka 'Character') to expected argument type 'String’ 오류가 떴다.

사실 String()으로 감싸서 형변환하면 되는거긴 하지만 근본적으로 왜 이런 오류가 떴는지 궁금해졌다.

일단 알아둬야 할 것은 String.Element == CharacterInt로 바로 형변환할 수 없다.

하지만 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기준,

  • split은 [String.Subsequence]를 반환하고,
  • 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) 비교가 의미 없는 이유

profile
UXUI Design Based IOS Developer

0개의 댓글