TIL/알고리즘 공부

프로그래머스 Lv. 1 Swift 알고리즘 - 크기가 작은 부분 문자열

여의도사노비 2022. 12. 26. 23:23
728x90

알고리즘을 멀리하던 사이 프로그래머스에 새로운 Lv1 문제들이 추가되었다!

추가된 문제들을 전부 다 풀고 Lv1 문제들 복습 한 번 하고 바로 Lv2로 넘어가고자한다.

 

알고리즘을 진짜 오랜만에 푸는 것 같은데... 확실히 알고리즘은 안풀면 실력이 금방 죽는다.

원래 잘하는 편도 아니었지만... 그럼에도 불구하고 이틀에 한 번씩 꾸준히 풀때는 Lv1 문제는 금방 금방 풀었는데, 이번에는 정말 오래걸린 것 같다. 오늘부터 다시 1일 2알고리즘 루틴을 시작해야겠다.

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. 먼저 t의 값들을 쉽게 다룰 수 있도록 char로 바꾼 값들을 array에 추가한다.
  2. t와 p의 값의 차이를 이용하여 몇가지의 케이스가 나올 수 있는지 확인 가능하다.(t.count - p.count - 1 만큼의 케이스가 나온다.)
  3. 각 케이스마다 원소의 한칸씩 이동하며 연속된 숫자(p.count)를 새로운 array에 추가한다.
  4. char로 바꿨던 array 원소들을 다시 string으로 바꾼뒤 join을 이용하여 값을 이어준다.
  5. 계속해서 데이터가 누적되는 것을 방지하기 위해 array를 지워주고, rotationCount가 한 번 돌때마다 count의 숫자를 1씩 올려 원하는 원소들이 한칸씩 밀려서 추가될 수 있도록 한다.
  6. 마지막으로 그렇게 추가된 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)

  1. char과 string의 속성에 따른 메써드가 많이 다르다. 매번 사용할때마다 새롭다..! 주로 어떤 메서드를 사용하는지 인지하고 있을 것.
  2. 항상 배열과 for문을 많이 이용하는데 분명 이 둘을 덜 쓸 수 있는 방법이 있을 것이다. 두 번째 풀때는 다른 방식으로 풀어봐야겠다.