본문 바로가기
카테고리 없음

코딩테스트 연습 > 연속 부분 수열 합의 개수 - JAVA

by 아찌방 2023. 12. 28.

 

 

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