[알고리즘] Swift -프로그래머스 연습문제 #147355(크기가 작은 부분 문자열)
2023. 5. 23. 15:54ㆍALGORITHM/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
반응형
'ALGORITHM > Swift' 카테고리의 다른 글
[알고리즘] Swift -프로그래머스 연습문제 #181873(특정한 문자를 대문자로 바꾸기) (0) | 2023.05.24 |
---|---|
[알고리즘] Swift -프로그래머스 연습문제 #142086(가장 가까운 같은 글자) (0) | 2023.05.24 |
[알고리즘] Swift -프로그래머스 연습문제 #150370(2023 카카오 블라인드_개인정보 수집 유효기간) (0) | 2023.05.22 |
[알고리즘] Swift -프로그래머스 연습문제 #159994(카드 뭉치) (0) | 2023.05.19 |
[알고리즘] Swift -프로그래머스 연습문제 #161989(덧칠하기) (0) | 2023.05.18 |