[level 2] 연속 부분 수열 합의 개수 - 131701
성능 요약
메모리: 133 MB, 시간: 774.08 ms
구분
코딩테스트 연습 > 연습문제
채점결과
정확성: 100.0
합계: 100.0 / 100.0
제출 일자
2024년 09월 14일 16:30:09
문제 설명
철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.
원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements
가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤
elements
의 길이 ≤ 1,000 - 1 ≤
elements
의 원소 ≤ 1,000
입출력 예
elements | result |
---|---|
[7,9,1,1,4] | 18 |
입출력 예 설명
입출력 예 #1
길이가 1인 연속 부분 수열로부터 [1, 4, 7, 9] 네 가지의 합이 나올 수 있습니다.
길이가 2인 연속 부분 수열로부터 [2, 5, 10, 11, 16] 다섯 가지의 합이 나올 수 있습니다.
길이가 3인 연속 부분 수열로부터 [6, 11, 12, 17, 20] 다섯 가지의 합이 나올 수 있습니다.
길이가 4인 연속 부분 수열로부터 [13, 15, 18, 21] 네 가지의 합이 나올 수 있습니다.
길이가 5인 연속 부분 수열로부터 [22] 한 가지의 합이 나올 수 있습니다.
이들 중 중복되는 값을 제외하면 다음과 같은 18가지의 수들을 얻습니다.
[1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22]
해결 답안
import java.util.*;
class Solution {
public int solution(int[] elements) {
Set<Integer> set = new HashSet<>();
for(int i = 1; i<=elements.length; i++){
//1~n까지의 합을 정하는 loop
for(int j=0; j<elements.length; j++){
// index의 시작점
int tmp = 0;
for(int k=j; k<j+i; k++){
if(k>=elements.length){
tmp+=elements[k-elements.length];
}else{
tmp+=elements[k];
}
}
set.add(tmp);
}
}
return set.size();
}
}
해결 과정
- 부분 수열의 합을 구하기 위해서는 받아온 배열을 2배로 확장하여 합을 계산하여야 한다고 판단
- 연속 부분 수열의 합으로 만들 수 있는 결과를 중복을 제거하고 제출해야하므로 SET 자료형에 담아 중복 제거
- 몇 자리를 더할지, 몇번 인덱스부터 더하기 시작할지, 실제로 더하는 부분, 총 3개의 반복문으로 구성하여 연산 처리
아쉬운점
3중 반복문을 사용하여 O(n^3)의 시간 복잡도로 구성되어 있음
제출 시 시간 초과는 피할 수 있었지만, 로직을 재구성하여 시간복잡도를 줄일 수 있는 방법을 찾아보자
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[level 2] n^2 배열 자르기 - 87390 (0) | 2024.09.15 |
---|---|
[level 2] 할인 행사 - 131127 (1) | 2024.09.15 |
[level 2] 구명보트 - 42885 (0) | 2024.09.14 |
[level 1] [PCCP 기출문제] 1번 / 동영상 재생기 - 340213 (2) | 2024.09.10 |
[level 2] 타겟 넘버 - 43165 (2) | 2024.09.09 |