https://school.programmers.co.kr/learn/courses/30/lessons/131701
풀이 - 나의 생각
이 문제를 풀기 위한 포인트!!!!
1. 중복 제거
2. 한 바퀴 돌리기
1. 중복 제거
Set 쓰면 해결!!
2. 한 바퀴 돌리기
이중 for문 쓰면서 해결했는데
결국에는 주어진 배열을 넘어가면
처음으로 넘어가는 게 중요
처음에는
index = i+j >= arr.length ? (i+j)-arr.length : i+j
이런 식으로 했는데
index = (i+j)%arr.length
이렇게 하면 더 간단하게 해결 할 수 있었다.
테스트 결과 속도도 더 빨랐다. ( 조건 검사를 할 필요가 없으니까)
이외.....
처음에는 더해지는 값들을 저장하기 위해
반복문 안에서
int형 변수 하나를 선언해서
값을 더해가면서 Set에 저장했는데
그것 보다는
반복문 밖에서 int형 배열을 선언해서
값을 더해가면서 저장하는게
속도가 더 빨랐다.
아무래도 반복문이 돌아갈때마다
변수를 선언 및 초기화 시키는데
메모리가 할당되는 시간이 발생하기 때문으로 파악된다.
코드
import java.util.*;
class Solution {
public int solution(int[] elements) {
Set<Integer> nums = new HashSet<>();
int len = elements.length; // .length() 가 계속 사용되기 때문에 차라리 변수를 하나 선언
int[] sums = new int[len]; // 연속으로 더할 값을 저장하기 위한 배열
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
sums[j] += elements[(i+j)%len]; // 주어진 배열의 범위를 넘어가지 않으면서 돌게
nums.add(sums[j]);
}
}
return nums.size(); // Set은 중복 제거가 알아서 되기 때문에, 저장된 Set의 길이가 나올 수 있는 모든 합의 경우의 수다
}
}
728x90