본문 바로가기

알고리즘(w.KOTLIN)/탐색

[알고리즘][KOTLIN]연속 부분 수열 합의 개수

728x90

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

1. 중복을 허용하지 않기 때문에 Set 자료구조를 선언한다.

2. 연속된 수열의 길이 정의하는 length 를 선언하고 초기값을 1로 한다.

3. length 가 (elements + 1) 의 크기가 될 때 까지 연속된 부분 수열의 합을 구한다.

4. 부분 수열의 합을 구할 때 주어진 수열이 원형 수열이기 때문에 index 가 elements 크기와 같거나 크면 elements 의 크기로 나눈 나머지를 index 로 한다.

5. 1번에서 선언한 Set 의 크기를 반환한다.

코드

class Solution {
    fun solution(elements: IntArray): Int {
        // 중복을 허용하지 않기 때문에 Set 을 선언한다.
        val answer = mutableSetOf<Int>()
        
        // 연속된 수열 길이로 초기 값을 1로 설정 한다.
        var length = 1
        val size = elements.size
        
        // length 가 elements + 1 의 크기가 될 때까지 탐색한다.
        while (length != size + 1) {
            for (i in 0 until size) {
                var sum = 0
                for (j in i until i + length) {
                    val idx = if (j >= size) {
                        j % size
                    } else {
                        j
                    }
                    sum += elements[idx]
                }
                
                answer.add(sum)
                //println("length=$length >> $answer")
            }
            
            length++
        }
        
        return answer.size
    }
}
728x90