본문 바로가기

알고리즘 스터디

[Programmers] 연속 부분 수열 합의 개수 - Golang

728x90

INDEX

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

     

    프로그래머스

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

    programmers.co.kr

     

    Solution

    원형으로 이루어진 수열은 사실 쭉 펼쳐진 선형 배열로 생각하면 됩니다.

    예제로 주어진 배열 [7, 9, 1, 1, 4] => [7, 9, 1, 1, 4, 7, 9, 1, 1]로 변환한 뒤 길이가 1인 연속 부분 수열, 길이가 2인 연속 부분 수열... 을 구하면 됩니다.

     

    또한 정답은 중복이 허용되지 않는 배열의 크기이므로 Set 구조가 필요합니다.

    하지만 Golang 에는 Set 구조가 없기 때문에 Map 을 활용해서 직접 구현해주어야 합니다.

    type set map[int]struct{}
    
    func (s set) Add(v int){
        s[v] = struct{}{}
    }
    func (s set) Length() int{
        return len(s)
    }

     

    이제 반복문을 통해 연속 부분 수열 합의 개수를 구해주면 됩니다.

    func solution(elements []int) int {
        answer := set {}
        elements_ := append(elements, elements[0:len(elements)-1]...) //원형수열을 길게 펼친 모양
        for startIdx := 0; startIdx<len(elements); startIdx++ {
            sum := 0
            for i:=0; i<len(elements); i++{
                sum+= elements_[startIdx+i]
                answer.Add(sum)
            }
        }
        return answer.Length()
        
    }

     

    전체코드

    type set map[int]struct{}
    
    func (s set) Add(v int){
        s[v] = struct{}{}
    }
    func (s set) Length() int{
        return len(s)
    }
    func solution(elements []int) int {
        
        answer := set {}
        elements_ := append(elements, elements[0:len(elements)-1]...)
        for startIdx := 0; startIdx<len(elements); startIdx++ {
            sum := 0
            for i:=0; i<len(elements); i++{
                sum+= elements_[startIdx+i]
                answer.Add(sum)
            }
        }
        return answer.Length()
        
    }