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

박형진·2023년 1월 9일
0

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


1. sum() 자료형을사용한 코드

# 원형 큐에서 움직인 후의 인덱스를 계산한 풀이 
def solution(elements):
    answer = set([sum(elements[:])])
    length = len(elements)
    for i in range(1, length):
        for j in range(length):
            if j+i <= length:
                answer.add(sum(elements[j:j+i]))
            else:
                idx = (j + i) % length
                answer.add(sum(elements[j:]) + sum(elements[:idx]))

    return len(answer)
# 원형 큐로 사용되는 리스트를 *2하여 선형적으로 접근하여 푸는 풀이(다른 사람 풀이 참조)
def solution(elements):
    partial = list()
    temp_el = elements*2
    for i in range(1,len(elements)+1):
        for j in range(len(elements)):
            partial.append(sum(temp_el[j:j+i]))

    answer = len(set(partial))
    return answer

2. 슬라이딩 윈도우를 사용한 코드

def solution(elements):
    length = len(elements)
    tot = sum(elements)
    s = set([tot])

    for cur_length in range(1, length):
        # 길이가 cur_length 인 수열
        init_hap = 0
        init_end = (cur_length - 1) % length
        # 0번째 인덱스에서 슬라이딩 윈도우 기본값을 세팅
        for i in range(init_end+1):
            init_hap += elements[i]
        print(f'시작={0}, 마지막={init_end}, 합={init_hap}')
        s.add(init_hap)
		
        # 1번째 인덱스에서 시작
        for start in range(1, length):
            end = (start + cur_length - 1) % length
            init_hap -= elements[start-1]
            init_hap += elements[end]
            print(f'시작={start}, 마지막={end}, 합={init_hap}')
            s.add(init_hap)

        print()
    return len(s)

profile
안녕하세요!

0개의 댓글