[알고리즘] Swift -프로그래머스 연습문제 #147355(크기가 작은 부분 문자열)

2023. 5. 23. 15:54ALGORITHM/Swift

728x90
반응형

문제링크

 

 

 

 

분석

숫자로 이루어진 문자열 t와 p가 주어질 때

t에서 p와 길이가 같은 부분 문자열 중에서

이 부분 문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 구하는 문제이다.

예를 들어 t = 3141592 이고 p = 271 인 경우,

t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592 이다.

이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 -> 총 2개이다.

 

풀이 과정

t 문자열에서 p의 길이만큼의 부분문자열을 구한다.

부분문자열 중에서 p보다 작거나 같은 것을 구한다.

 

문자열을 인덱스로 접근하기 위해서 String -> Array 로 변환한다.

let tArr = Array(t)

 

t의 길이에서 p의 길이만큼 빼고 +1을 해주면 p의 길이와 같은 인덱스 만큼 반복하게 된다.

그 다음으로는 부분 문자열을 만드는 것인데 위에서 구한 인덱스에서 p의 길이만큼을 반복하여 부분문자열을 만들어준다.

String은 +를 통해서 문자를 연결할 수 있다.

부분 문자열을 만들어 다시 Int형으로 변환하여 p보다 작거나 같은 수를 구한다.

 

let pCount = p.count

for i in 0..<t.count-pCount+1 {
    var sub = String()
    for j in i..<i+pCount {
        sub += String(tArr[j])
    }
    if Int(sub)! <= Int(p)! {
        result += 1
    }
}

 

 

 

풀이

import Foundation

func solution(_ t:String, _ p:String) -> Int {
    var result = 0
    let pCount = p.count
    let tArr = Array(t)
    
    for i in 0..<t.count-pCount+1 {
        var sub = String()
        for j in i..<i+pCount {
            sub += String(tArr[j])
        }
        if Int(sub)! <= Int(p)! {
            result += 1
        }
    }
    
    return result
}

 

결과

print(solution( "3141592", "271"))

 

 


📂  정리

 

다른 풀이

dropFirst와 prefix를 이용하여 코드 줄이기

import Foundation

func solution(_ t:String, _ p:String) -> Int {
    var result = 0

    for i in 0..<t.count-p.count+1 {
        let sub = t.dropFirst(i).prefix(p.count)
        
        result +=  Int(sub)! - Int(p)! <= 0 ? 1 : 0
    }
    
    return result
}

테스트 결과 성능적으로 좋은 것은 잘 모르겠다.

위의 방식에서는 삭제를 하지 않고 그대로 문자열을 합쳐서 부분문자열을 만들었다면

아래에서는 처음 부분을 삭제하기 때문이 시간이 걸린다.

 

 

 

 

 

728x90
반응형