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

임정민·2023년 9월 17일
0

알고리즘 문제풀이

목록 보기
101/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 40분 소요


def solution(elements):
    from collections import deque

    elements = deque(elements)
    len_el = len(elements)
    answer = set()

    # 돌리기
    for i in range(1,len_el+1):
        tmp = elements.copy()

        for j in range(1,len_el+1):

            answer.add(sum(list(tmp)[:i]))

            tmp.rotate(1)
    answer.add(sum(list(tmp)))
    return len(answer)

원형 수열에서 모든 케이스의 연속된 요소를 더하여 생긴 합이 갯수를 구하는 문제입니다. 입력된 리스트를 deque로 변환하고 한칸씩 rotate하여 1~리스트 길이(len(elements)만큼 씩 더해보며 답을 구하는 방식입니다. 중복값을 제거하기 위해 set() 구조에 넣었습니다.🐸🐸🐸

[다른사람의 풀이1]


def solution(elements):
    answer = 0
    cycle = elements + elements
    s = []
    for i in range(len(elements)):
        for j in range(len(elements)):
            s.append(sum(cycle[i:i+j]))
    return len(set(s))

2중 for문으로 해결한 다른 풀이를 볼 수 있었는데 문제 테스트 케이스 기준 성공은 되지만 정확히 따지고 보면 이는 잘못된 풀이었습니다. 문제에서 요구하는 사항은 1~전체 리스트 요소 갯수까지 더하며 모든 케이스를 구하라는 것인데 위 코드대로 라면 입력된 리스트를 모두 더한 합은 구할 수 없습니다. 대신 인덱스 [0:0],[1:1]... 과 같이 합이 무조건 0이 되는 케이스가 추가되었고 이는 리스트 요소를 모두 더한 합은 1개인 관점에서 결론적으로 문제에서 최종적으로 요구하는 합의 갯수가 같아져 성공된 것으로 보입니다. 타 블로그에 있는 풀이를 맹신하지 않는 것이 좋다고 느꼈습니다.🐦🐦🐦

[다른사람의 풀이2]


def solution(elements):
    sum_unique = set()
    # 성분 개수
    for n in range(len(elements)):
        # 시작점
        for i in range(len(elements)):
            # 배열의 길이 초과할 경우
            if n + i > len(elements):
                e_sum = sum(elements[i:]) + sum(elements[:i + n - len(elements)])
            else:
                e_sum = sum(elements[i:i + n])
            sum_unique.add(e_sum)
    return len(sum_unique)

2중 for문에서 인덱싱을 통해 구현한 풀이입니다. 0~n번의 요소까지 더하되 인덱스가 입력된 리스트의 길이를 초과할 경우 음수인 인덱스를 변환하여 풀어낸 방식입니다.🐻‍❄️🐻‍❄️🐻‍❄️

감사합니다.

profile
https://github.com/min731

0개의 댓글