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

[프로그래머스 | 파이썬 / 자바스크립트] 연속 부분 수열 합의 개수(연습문제/ level 2)

by 청량리 물냉면 2023. 2. 28.
반응형
문제

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

 

프로그래머스

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

programmers.co.kr

 

 

🐍파이썬
def solution(elements):
    arr = [i for i in elements] #길이1
    arr.append(sum(elements))   #길이n
    for i in range(2, len(elements)):  #길이 2 ~ n-1개의 부분수열
        for j in range(len(elements)):
            hap = 0
            if i + j > len(elements):	#배열의 인덱스를 벗어날 경우
                hap += sum(elements[j:len(elements)])
                hap += sum(elements[0:(i + j)%len(elements)])
            else:
                hap += sum(elements[j:i+j])
            arr.append(hap)	#구한 합을 arr에 추가
    return len(set(arr))	#중복제거 후 출력
더보기
효율성 극악...

 

 

다른 풀이 방법

def solution(elements):
    ll = len(elements)
    res = set()
    for i in range(ll):
        ssum = elements[i]
        res.add(ssum)
        for j in range(i+1, i+ll):
            ssum += elements[j%ll]
            res.add(ssum)
    return len(res)

코드만 봤을 때는 이해하기 힘들어 각 반복문마다 변수의 값을 출력해 보았다.

def solution(elements):
    ll = len(elements)
    res = set()
    for i in range(ll):
        ssum = elements[i]  #원소 1개
        res.add(ssum)
        print(ssum)
        for j in range(i+1, i+ll):
            print(i, j, j%ll)
            ssum += elements[j%ll] 
            print(ssum)
            res.add(ssum)
    return len(res)

출력결과는 아래와 같다.

7	# i == 0, 원소 1개의 합
0 1 1	#i, j, i%ll
16	# i == 0부터 원소 2개의 합
0 2 2
17	# i == 0부터 원소 3개의 합
0 3 3
18	# i == 0부터 원소 4개의 합
0 4 4
22	# i == 0부터 원소 5개의 합
9	# i == 1, 원소 1개의 합
1 2 2
10	# i == 1부터 원소 2개의 합
1 3 3
11	# i == 1부터 원소 3개의 합
1 4 4
15	# i == 1부터 원소 4개의 합
1 5 0
22	# i == 1부터 원소 5개의 합
1	# i == 2, 원소 1개의 합
2 3 3
2
2 4 4
6
2 5 0
13
2 6 1
22
1	# i == 3, 원소 1개의 합
3 4 4
5
3 5 0
12
3 6 1
21
3 7 2
22
4	# i == 4, 원소 1개의 합
4 5 0
11
4 6 1
20
4 7 2
21
4 8 3
22

elements의 각 원소마다 연속되는 1개, 2개, 3개, 4개,...의 값을 구하여 set()에 add한 풀이이다.

 

 

🐥자바스크립트
function solution(elements) {
    var answer = 0;
    let eSet = new Set();
    for(let i = 0; i < elements.length; i++){
        answer = elements[i];
        eSet.add(answer);
        for(let j = i+1; j < i+elements.length; j++){
            answer += elements[j%elements.length];
            eSet.add(answer)
        }
    }
    return eSet.size;
}

위 파이썬 <다른 풀이 방법> 풀이를 자바스크립트 풀이로 구현하였다.

반응형