Python/프로그래머스

연속 부분 수열 합의 개수

룰루랄라룰루랄라 2024. 3. 25. 23:23

자연수로 이루어진 연속 원형 수열의 합으로 만들 수 있는 수가 모두 몇 가지 인지 구하고 싶다는 철수 이다..

원형 수열이란 일반 적인 수열에서 처음과 끝이 연결된 수열이다..

[7,4,1,1,9] 로 이루어진 원형 수열

 

원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를.. 철수를 위해 구해보도록 하자..

 

처음엔 원형 수열...? 뭐.. ? 

라고 했지만 별건 없었다

말 그대로 이어져 있기 때문에 연속 부분 수열 합을 구할때

만약 3개의 합이 필요하다면 [7,4,1], [4,1,1], [1,1,9] 이렇게 가다가 [1,9,7], [9,7,4] 이런식으로 끊기지 않고 다시 앞의 원소를 참조하는 식의 특징이 있다는 것..!

 

 길이가 n 이라면 각 1개의 합으로 구한 수열 부터, n개의 합으로 구한 수열을 모두 구한 후, 유니크한 수만 뽑아내어 개수를 세어 주면 되는 것이다..!

 

최종 코드는 이렇다!

def solution(elements):
    answer = 0
    num_list=[]
    
    for i in range(len(elements)): # 1개, 2개, 3개... 
        for j in range(len(elements)): # 첫번째, 두번째, 세번째...
            if (j+i+1)>len(elements):
                num_list.append(sum(elements[j:]+elements[:j+i+1-len(elements)]))
            else:
                num_list.append(sum(elements[j:j+i+1]))
    
    num_list = list(set(num_list))
    return len(num_list)

 

첫번째 for 문은 +1 개씩 더 많은 수를 합하며 수열을 만들어 주기 위한 부분 이고

두번째 for 문은 참조할 원소 인덱스의 첫부분을 하나씩 뒤로 집어주기 위한 부분 이다!

원형 수열이라 인덱스가 배열의 길이를 넘을 시 앞으로 돌아가므로 배열의 길이를 넘는 경우와 아닌 경우를 단순히 나누어 주었고..!

sum 결과들을 list 로 담은 후 set 으로 유니크하게 만들고 남은 숫자의 갯수를 return~ 

 

원형 수열이 너무 낯설어서 처음엔 뭔소리냐며 키보드를 팡팡 칠뻔 했지만

그래도 풀었다~

 

 

출처 : https://school.programmers.co.kr/learn/challenges

'Python > 프로그래머스' 카테고리의 다른 글

귤 고르기  (0) 2024.03.25
예상 대진  (1) 2024.03.25
구명보트  (0) 2024.03.25
카펫  (0) 2024.03.25
피보나치 수  (0) 2024.03.25