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

2022. 11. 21. 13:18

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

 

프로그래머스

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

programmers.co.kr

 

 

코드

def solution(elements):
    new_elements = elements + elements[:len(elements)-1]
    
    answer_list = []
    for num in range(1, len(elements)+1):
        tmp_list = []
        for i in range(len(elements)):
            tmp_list.append(sum(new_elements[i:i+num]))
        answer_list += tmp_list

    return len(set(answer_list))

 

 

설명

원형 수열의 구현을 위해 주어진 수열에 주어진 수열(마지막 원소만 제외)을 덧붙여서 문제를 풀 것이다.

모듈러 연산을 통해서도 원형 수열을 구현할 수 있는데, 이 문제의 경우 수열을 붙여버리는게 더 쉽게 풀리는 것 같다.

 

1부터 elements 수열의 길이까지 반복하면서

새로 만든 수열(이어 붙인것)를 슬라이싱해서 더해준 것들을 중복처리하고 개수를 세주면 정답이 나온다.

 

new_elements = elements + elements[:len(elements)-1]

new_elements는 원형 수열을 나타내는 변수이다.

elements와 elements(마지막 원소 빼고)를 더한 리스트이다.

 

answer_list = []
for num in range(1, len(elements)+1):
    tmp_list = []
    for i in range(len(elements)):
        tmp_list.append(sum(new_elements[i:i+num]))
    answer_list += tmp_list

answer_list는 모든 연속 부분 수열의 합들을 저장할 리스트이다.

1부터 elements의 길이+1까지 반복한다(연속 부분 수열의 길이를 결정).

tmp_list는 각 단계의 연속 부분 수열의 합을 저장할 리스트이다.

 

0부터 elements의 길이까지 반복한다.

new_elements를 i부터 i+num까지 슬라이싱 한 리스트를 sum(길이가 num인 연속 부분 수열의 합)하여 tmp_list에 append한다.

 

안쪽 반복이 끝나면 answer_list에 tmp_list를 더한다.

 

return len(set(answer_list))

answer_list를 set 자료형으로 변환하고(중복 제거) 그 길이를 반환한다.

BELATED ARTICLES

more