HIT해

[Swift/프로그래머스] 연속된 부분 수열의 합 (그리디) 본문

Swift/Swift 알고리즘

[Swift/프로그래머스] 연속된 부분 수열의 합 (그리디)

힛해 2024. 10. 31. 21:43
728x90
import Foundation

func solution(_ sequence:[Int], _ k:Int) -> [Int] {
    var left = 0
    var right = 0
    var sum = sequence[0]
    
    var minLength = sequence.count
    var result : [Int] = []
    
    while right < sequence.count {
        if sum == k {
            let length = right - left
            if length < minLength {
                minLength = length
                result = [left, right]
            }
            right += 1
            if right < sequence.count {
                sum += sequence[right]
            }
            sum -= sequence[left]
            left += 1
        }
        else if sum < k {
            right += 1
            if right < sequence.count {
                sum += sequence[right]
            }
        }
        else { // sum > k
            sum -= sequence[left]
            left += 1
        }
    }
    
    return result
}

https://school.programmers.co.kr/learn/courses/30/lessons/178870

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

알고리즘 공부를 열심히 해서 그런가.

 

단순한 완전탐색, 그리디 문제도 LIS를 적용할 수 있는건가? 기대했지만 아니었다.

 

left right 인덱스를 활용해서 최적으로 순회하며 부분수열의 합을 구하는 문제다.

 

풀이

import Foundation

func solution(_ sequence:[Int], _ k:Int) -> [Int] {
    var left = 0
    var right = 0
    var sum = sequence[0]
    
    var minLength = sequence.count
    var result = []
    
    while right < sequence.count {
        if sum == k {
            let length = right - left
            if length < minLength {
                minLength = length
                result = [left, right]
            }
            right += 1
            if right < sequence.count {
                sum += sequence[right]
            }
            sum -= sequence[left]
            left += 1
        }
        else if sum < k {
            right += 1
            if right < sequence.count {
                sum += sequence[right]
            }
        }
        else { // sum > k
            sum -= sequence[left]
            left += 1
        }
    }
    
    return result
}