Algorithm/프로그래머스

[프로그래머스>LV2] 연속된 부분 수열의 합 (Kotlin, Python)

RIEN😚 2023. 4. 10. 17:29
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제

[입력]

  • 수열을 나타내는 정수 배열 sequence
  • 부분 수열의 합을 나타내는 정수 k

[결과]

조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return

 

2. 풀이

알고리즘 문제 중에 잘 알려진 최대 연속 부분 수열의 합으로 생각하고 풀면 큰일나는 문제입니다.ㅎㅎ

 

조건 중에

📌 기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열이어야 합니다.

에서 알 수 있듯이, 해당 문제는 부분 수열을 띄엄띄엄 만드는 것이 연속된 부분 수열들로 이루어진다는 것에 유의하셔야 합니다.

 

이를 통해 이 문제는 투 포인트를 사용해 풀 수 있다는 것을 알 수 있습니다. 🤗

 

3. 코드

Kotlin
class Solution {
    fun solution(sequence: IntArray, k: Int): IntArray {
        var answer: IntArray? = null
        val n = sequence.size
        var minLength = n
        var maxSum = sequence.first()
        var left = 0
        var right = 1

        while (left < right) {
            val length = right - left
            if (maxSum == k && minLength > length) {
                minLength = length
                answer = intArrayOf(left, right - 1)
            }
            if (maxSum <= k && right < n) {
                maxSum += sequence[right]
                right += 1
            } else {
                maxSum -= sequence[left]
                left += 1
            }
        }

        return answer ?: intArrayOf(0, n - 1)
    }
}

 

Python
def solution(sequence, k):
    answer = []
    
    n = len(sequence)
    # 부분수열의 길이, 부분수열의 합
    min_len, max_sum = n, sequence[0]
    left, right = 0, 1
    
    while left < right:
        length = right - left
        if min_len > length and max_sum == k:
            answer = [left, right-1]
            min_len = length
        if max_sum <= k and right < n:
            max_sum += sequence[right]
            right+=1
        else:
            max_sum -= sequence[left]
            left+=1
            
    if answer == []: return [0,n-1]
    return answer

 

 

반응형