TIL/알고리즘 공부
프로그래머스 Lv. 1 Swift 알고리즘 - 크기가 작은 부분 문자열
여의도사노비
2022. 12. 26. 23:23
728x90
알고리즘을 멀리하던 사이 프로그래머스에 새로운 Lv1 문제들이 추가되었다!
추가된 문제들을 전부 다 풀고 Lv1 문제들 복습 한 번 하고 바로 Lv2로 넘어가고자한다.
알고리즘을 진짜 오랜만에 푸는 것 같은데... 확실히 알고리즘은 안풀면 실력이 금방 죽는다.
원래 잘하는 편도 아니었지만... 그럼에도 불구하고 이틀에 한 번씩 꾸준히 풀때는 Lv1 문제는 금방 금방 풀었는데, 이번에는 정말 오래걸린 것 같다. 오늘부터 다시 1일 2알고리즘 루틴을 시작해야겠다.
이 문제를 풀면서 생각한 논리적 흐름
- 먼저 t의 값들을 쉽게 다룰 수 있도록 char로 바꾼 값들을 array에 추가한다.
- t와 p의 값의 차이를 이용하여 몇가지의 케이스가 나올 수 있는지 확인 가능하다.(t.count - p.count - 1 만큼의 케이스가 나온다.)
- 각 케이스마다 원소의 한칸씩 이동하며 연속된 숫자(p.count)를 새로운 array에 추가한다.
- char로 바꿨던 array 원소들을 다시 string으로 바꾼뒤 join을 이용하여 값을 이어준다.
- 계속해서 데이터가 누적되는 것을 방지하기 위해 array를 지워주고, rotationCount가 한 번 돌때마다 count의 숫자를 1씩 올려 원하는 원소들이 한칸씩 밀려서 추가될 수 있도록 한다.
- 마지막으로 그렇게 추가된 lowValue 배열에서 p보다 작거나 같은 숫자들의 개수를 찾아준다.
* 코드
import Foundation
func solution(_ t:String, _ p:String) -> Int {
let rotationCount = t.count - p.count
var count = 0
var tSplited = [Character]()
var array: [String] = []
var lowValue: [String] = []
for i in t {
tSplited.append(i)
}
for _ in 0...rotationCount {
for i in count...count+p.count-1 {
var valueArray = [Character]()
valueArray.append(tSplited[i])
let str = String(valueArray)
array.append(str)
}
let value = array.joined(separator: "")
lowValue.append(value)
array.removeAll()
count += 1
}
let answer = lowValue.filter { Int($0)! <= Int(p)! }
return answer.count
}
정리(Today I Learned)
- char과 string의 속성에 따른 메써드가 많이 다르다. 매번 사용할때마다 새롭다..! 주로 어떤 메서드를 사용하는지 인지하고 있을 것.
- 항상 배열과 for문을 많이 이용하는데 분명 이 둘을 덜 쓸 수 있는 방법이 있을 것이다. 두 번째 풀때는 다른 방식으로 풀어봐야겠다.