프로그래머스

[프로그래머스_Kotlin] 연속 부분 수열 합의 개수

내손은개발 🐾 2024. 4. 15. 21:18
 

프로그래머스

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

programmers.co.kr

 

 

내 풀이

class Solution {
    fun solution(elements: IntArray): Int {
        val answer = mutableSetOf<Int>()
        val elements2 = elements + elements 

        for (i in 1..elements.size) {
            for (j in elements.indices) {
                var sum = 0
                for(k in j until j + i){
                    sum += elements2[k]
                }
                answer.add(sum)
            }
        }
        return answer.size
    }
}

 

문제 이해를 먼저 하자면

7,9,1,1,4의 수가 주어지면 순서대로 연속 부분의 수열 합으로 만들 수 있는 겹치지 않는 개수를 구하는 문제이다.

 

입출력 예시를 순서대로 다시 작성해보면

1. [7,9,1,1,4]

 

2. [16,10,2,5]

 

3. [17,11,6,12,20]

 

4. [13.18,15,21]

 

5. [22]

 

배열의 길이만큼 반복하면 된다.

위에 그림말고도 그려봤는데 알 수 있는 점은 원형으로 만들지 않아도

[7,9,1,1,4]를 한 개 더 붙이면 계산을 충분히 할 수 있다.

val elements2 = elements + elements //[7, 9, 1, 1, 4, 7, 9, 1, 1, 4]

3중 for문을 써서 풀었지만 너무 불편하다.

 

다른 사람의 풀이

class SolutionOther {
    fun solution(elements: IntArray): Int {
        val doubling = elements+elements
        val result = HashSet<Int>()
        for (i in 1..elements.size) {
            result.addAll((elements.indices).map {
                doubling.slice(it until it + i).sum()
            })
        }
        return result.size
    }
}