철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.
원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements
가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.
elements
의 길이 ≤ 1,000elements
의 원소 ≤ 1,000elements | result |
---|---|
[7,9,1,1,4] | 18 |
1차원 배열을 원형수열처럼 탐색하고 부분 수열을 모두 찾아서 그 부분수열의 합의 갯수를 구하는 문제이다.
Set을 사용하여 중복되지 않게 부분수열의 합을 저장한다.
첫 for문의 i는 부분수열 원소의 갯수이다
j는 부분수열을 시작할 index위치이다.
elements[]를 탐색하면서 curIdx를 증가시키다가 curIdx가 elements[]의 마지막일 경우
0으로 바꾸어 원형수열처럼 탐색할 수 있도록 해준다.
import java.util.*;
class Solution {
public int solution(int[] elements) {
int answer = 0;
Set<Integer> sumElementsSet = new HashSet<>();
for (int i = 1; i <= elements.length; i++) {
for (int j = 0; j < elements.length; j++) {
int sum = 0;
int curIdx = j;
for (int k = 0; k < i; k++) {
sum += elements[curIdx++];
if(curIdx >= elements.length) curIdx = 0;
}
sumElementsSet.add(sum);
}
}
answer = sumElementsSet.size();
return answer;
}
}