(알고리즘) split() 대 components()

새로운 카테고리 게시 시작!
!

연산!

나는 직업을 얻기 위해 천천히 그리고 점진적으로 발전하려고 노력하고 있습니다.

과거에 Python으로 해결하는 것을 중단했지만 Swift를 다시 사용하기 시작했습니다!

백준의 브론즈를 먼저 풀어봤는데 정말 짜증나더라구요 ^____^

(오늘의 이슈)

10818: 최소, 최대

정수의 개수 N(1 ≤ N ≤ 1,000,000)은 첫 번째 줄에 지정됩니다.

두 번째 줄에는 공백으로 구분된 N개의 정수가 포함됩니다.

모든 정수는 -1,000,000보다 크거나 같고 1,000,000보다 작거나 같은 정수입니다.

www.acmicpc.net

브론즈 3 문제

하지만 비참…


아니 브론즈3인데 저게 뭔데

1톤

import Foundation

var cnt = Int(readLine()!
)!
var nums: (Int) = readLine()!
.components(separatedBy: " ").map { Int($0)!
} var maxN = nums(0) var minN = nums(0) for i in 1..<cnt { maxN = max(maxN, nums(i)) minN = min(minN, nums(i)) } print("\(minN) \(maxN)")

2t

import Foundation

var cnt = Int(readLine()!
)!
var nums: (Int) = readLine()!
.components(separatedBy: " ").map { Int($0)!
} var sortedNums = nums.sorted() print("\(sortedNums(0)) \(sortedNums(cnt-1))")

3t

import Foundation

var cnt = Int(readLine()!
)!
var nums: (Int) = readLine()!
.components(separatedBy: " ").map { Int($0)!
}.sorted() print("\(nums.first!
) \(nums.last!
)")

지금까지 해봤는데 잘 모르겠어서 구글링 해봤습니다.

components()에 문제가 있었습니다…

그래서 답이 나왔다

import Foundation // 사실 얘도 없어도 됨

var cnt = Int(readLine()!
)!
var nums: (Int) = readLine()!
.split(separator: " ").map { Int($0)!
} print("\(nums.min()!
) \(nums.max()!
)")


split() 및 components()가 작동하지 않는 이유!
!
!
!
둘의 차이점이 궁금했는데

그래서 다시 구글링을 해보니 꽤 명료했다.

첫 번째 구성요소()공식 문서 v



먼저, components() Foundation은 import를 해야 합니다.

공식 문서를 보면 입력 값이 하나만 있습니다.

구분자: 문자열

·

통해 분리문자열 값에 따라 구분할 문자열을 결정합니다.

(나는 항상 Swift가 매우 읽기 쉽다고 느낀다)

·

반환 값은 (끈)

따라서 알고리즘을 풀 때

import Foundation

var nums = readLine()!
.components(seperatedBy: " ").map { Int($0)!
}

공백으로 구분된 문자열을 분할하려면 입력 값으로 ” “를 입력합니다.

(나중에 map 함수를 사용하여 반환 값을 String에서 Int로 변환합니다.

)

·

·

·

그리고 분할()공식 문서 v



이것은 기본적으로 Swift와 함께 제공되는 자식이므로 별도로 가져올 필요가 없습니다.

그리고 입구는 3개!
(필수 자식은 구분 기호입니다)

구분자: 본인. 요소

maxSplits: 정수

OmitEmptySubsequences: 부울

구성품과 비슷합니다 구분자값을 기준으로 분류할 항목을 지정합니다.

그러나 구성 요소와 달리 유형은 Self.Elements입니다.

split()은 어떤 배열에 사용됩니까?

배열 요소의 유형을 말합니다!
!

따라서 타입이 (String)이면 Self.Elements는 String 타입이 되고,

유형(Int)인 경우 Self.Elements는 Int 유형입니다.

·

다음 입력 최대 분할 최대 분할 수를 입력으로 사용

공식 문서에는 maxSplits: Int = Int.max ,

즉, 기본값은 Int.max이며 int 유형에서 가장 큰 숫자로 나타납니다!

즉, 입력값을 주지 않으면 최대한 쪼개지는 것 같죠?

·

다음 EmptySubsequences 생략 하지만

이것은 생략(생략) void(빈) 하위 시퀀스(하위 문자열)입니다.

즉, 분할 결과에 빈 문자열이 포함되어야 합니까? 이것은

입력값이 “1 2 3 4 5″인 경우(공백 3개 사용)

참이면 (“1”, “2”, “3”, “4”, “5”)

틀렸다면 (“1”, “2”, “3”, “”, “”, “4”, “5”) (공백 3개 사이에 “”가 2개 들어있기 때문에)

이 반환 값을 얻습니다.

기본적으로 참!

·

반환 값은 (셀프 에피소드) ~처럼

자신의 배열 요소로 구성된 배열로 생각할 수 있습니다!

(Subsequence의 정확한 의미를 아시는 분은 댓글 부탁드립니다…)


components()에서 작동하지 않는 이유를 말하면 split()에서 작동한 것입니다!

그 이유는 EmptySubsequences 생략 그것 때문인 것 같아요!

components() 및 split()을 사용한 예제의 결과는 다음과 같습니다.

import Foundation

var nums = "1 2 3   4 5"
print(nums.components(separatedBy: " ")) // ("1", "2", "3", "", "", "5")
print(nums.split(separator: " ")) // ("1", "2", "3", "4", "5")

components()도 단어 “”를 생성하기 때문에 .map() 함수를 사용하여 강제로 int 유형으로 압축을 풀면 컴파일 오류가 발생합니다!

그런데 여기서 이상한 일이 벌어지는데…

import Foundation

var nums = "1 2 3   4 5"
print(nums.components(separatedBy: " ").map { Int($0)!
}) // 컴파일 에러

이렇게 실행하면 위에서 쓴 것처럼 컴파일러 오류가 발생합니다.

에러 자체는 이상하지 않지만,

구성요소 사용() 10818: 최소, 최대 문제를 풀 때

‘Wrong’ 또는 ‘Compile Error’가 아니라 ‘Timeout’입니다.

음 원래 백준이는 컴파일 오류를 타임아웃으로 취급하는데…

인터넷 검색 후 시간 복잡도에 차이가 없는 것 같지만 그 이유는 무엇입니까?

그래서 이렇게 함으로써 구성요소() 그리고 분할()차이를 식별하면 완성!


(원천)

Swift의 문자열 처리(분할 대 구성 요소)

안녕하세요. Green 이번 포스팅에서는 Swift에서 문자열을 처리하는 두 가지 메소드인 split과 component에 대해 알아보도록 하겠습니다 Swift 언어의 특성상 문자열은 다른 언어에 비해 다루기가 조금 어렵습니다.

green1229.tistory.com