본문 바로가기
프로그래머스/Python

[프로그래머스] 연속 부분 수열 합의 개수 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 16.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

  1. 부분 수열의 합을 저장할 리스트를 생성한다. li = list()
  2. 각 부분 수열의 경우는 길이가 1부터 부분 수열 원소 크기까지 반복한다. for k in range(len(elements))
  3. 각 부분 수열의 시작을 나타내는 변수를 생성하고 초기화한다. i = 0
  4. 각 부분 수열의 끝을 나타내는 변수를 생성하고 각 경우별 길이만큼 떨어진 값을 저장한다. j = k + 1
  5. 각 길이별 경우는 모두 부분 수열 원소 크기만큼 그 합의 경우가 나오기 때문에 부분 수열 원소 크기만큼 연산을 반복한다. for _ in range(len(elements))
  6. 만약 부분 수열의 끝을 나타내는 값이 부분 수열의 원소 크기보다 같거나 크면 앞에서부터 부분 수열을 이어 해당 값을 더해줘야 한다. if (j >= len(elements))
  7. 따라서 시작부터 끝까지 합을 더하고 인덱스 0부터 끝에서 부분 수열 원소 크기를 뺀 인덱스까지 더하여 해당 값을 리스트에 추가한다. li.append(sum(elements[i : ]) + sum(elements[ : j - len(elements)]))
  8. 반면에 시작과 끝이 모두 부분 수열 원소의 크기 안에 있으면 else
  9. 그냥 시작부터 끝까지 원소를 더하여 그 값을 리스트에 추가한다. li.append(sum(elements[i : j]))
  10. 다음 부분 수열로 이동하여 연산을 계속하기 위해 각 시작 위치와 끝 위치를 1칸씩 이동한다. i += 1  j += 1
  11. 모든 경우의 합을 저장한 리스트에서 중복된 값을 제거하고 그 리스트의 길이를 저장한다. answer = len(set(li))
반응형

3. 소스코드

def solution(elements):
    answer = 0
    
    li = list()
    for k in range(len(elements)):
        i = 0
        j = k + 1
        for _ in range(len(elements)):
            if (j >= len(elements)):
                li.append(sum(elements[i : ]) + sum(elements[ : j - len(elements)]))
            else:
                li.append(sum(elements[i : j]))

            i += 1
            j += 1
    
    answer = len(set(li))

    return answer
728x90
반응형