Set을 활용하여 원형 배열의 부분 수열 합 구하기
알고리즘: BruteForce?
import java.util.*;
class Solution {
public int solution(int[] elements) {
Set<Integer> answer = new HashSet<>();
int len = elemnets.length;
for (int i = 0; i < len; i++) {
int tmp = 0;
for (int j = 0; j < len; j++) {
tmp += elements[(i + j) % len]; // 나머지 연산을 통한 원형 배열 순회
answer.add(tmp); // 누적합
}
}
return answer.size();
}
}
이번 문제는 부분 수열의 합에서 중복된 값을 제거하는 것이 중요 포인트로, Set 자료형을 사용하였다. 원형 배열은 내가 사랑하는 자료구조여서 나머지 연산을 통한 접근법이 바로 떠올랐다. 그런데 다른 풀이들을 찾아보니 같은 배열을 2개 붙여서 진행하는 방식도 많아 보였다.
아무튼, 나는 처음에는
for (int i = 0; i < len; i++) {
for (int j = 1; j <= len; j++) {
int tmp = 0;
int l = i;
for (int k = 1; k <= j; k++) {
tmp += elements[l % len];
l++;
}
answer.add(tmp);
}
}
이런 식으로 삼중 포문을 돌렸었다. 각각의 인덱스에 대해서 자기 자신, 자기 자신 + 1, 자기 자신 + 2 ... 자기 자신 + 마지막 인덱스 이런식으로 돌리고 싶었던 거였는데, 아무래도 삼중 포문을 돌릴 일인가 싶어서 챗쥐피티의 힘을 빌렸더니 위와 같이 이중 포문으로 바꾸어주었다.
왜 난 이런 생각이 바로 안 떠오를까? 다음부턴 더 생각해보기를.
class Solution {
public int solution(int[] elements) {
Set<Integer> answer = new HashSet<>();
int len = elements.length;
for (int i = 0; i < len; i++) {
final int start = i;
answer.add(IntStream.range(0, len)
.map(j -> elements[(start + j) % len])
.sum());
}
return answer.size();
}
}
이렇게 스트림처리도 가능하다. 스트림.. 언제 공부하냐 ㅠㅠ