VesselWheel

크기가 작은 부분문자열 본문

Coding Test Practice in Swift

크기가 작은 부분문자열

JasonYang 2024. 2. 22. 09:56

문제

 

풀이

import Foundation

func solution(_ t:String, _ p:String) -> Int {
    
    let length = p.count  // p는 1 ≤ p의 길이 ≤ 18 를 갖음
    var count = 0 // 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수
    
    for i in 0..<(t.count-length+1) {
        let startIndex = t.index(t.startIndex, offsetBy: i)
        let endIndex = t.index(t.startIndex, offsetBy: i+length)
        let range = startIndex..<endIndex
        
        if Int64(t[range])! <= Int64(p)! {
            count += 1
        }
        
    }
    return count
}

 

해석

1. let length = p.count :  파라미터 p의 길이를 우선 구하고

2. var count = 0 : 반환값인 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 얻기 위해 0으로 초기화 

3. for문으로 임의의 순회 값인 i 를 (t.count-length+1)까지 반복순회한다. 

3-1. (t.count-length+1) : length(p의 문자열 길이)의 +1은

4. index(_:offsetBy:) 메소드는 주어진 기준 인덱스로부터 특정 거리만큼 떨어진 위치의 인덱스를 반환

더보기

for i in 0..<(t.count-length+1)을 통해 i는 0부터 t.count-length까지 반복됩니다. 이는 문자열 t에서 길이가 p와 같은 부분문자열의 시작 인덱스를 나타냅니다.

예를 들어, t의 길이가 5이고 p의 길이가 3이라고 가정해봅시다. 이 경우 t에서 길이가 3인 부분문자열의 시작 인덱스는 0, 1, 2가 됩니다. 이때 t.count-length는 2가 되므로, for i in 0..<t.count-length로 하면 i는 0과 1만을 반복하게 됩니다. 따라서 t에서 시작 인덱스가 2인 부분문자열을 빠뜨리게 됩니다.

이를 방지하고 모든 부분문자열을 탐색하기 위해 +1을 해줍니다. 이렇게 해주면 i는 0, 1, 2를 모두 반복하게 되어 t에서 길이가 3인 모든 부분문자열을 탐색할 수 있게 됩니다.

4-1. index(_:offsetBy:) 메소드는 주어진 기준 인덱스로부터 특정 거리만큼 떨어진 위치의 인덱스를 반환

       예를 들어, t.index(t.startIndex, offsetBy: i)는 문자열 t의 시작 위치에서 i만큼 떨어진 위치의 인덱스를 반환

 

5.