본문 바로가기
JAVA/Coding Test Study

[Lv.2] 프로그래머스 - 연속 부분 수열 합의 개수 : Java

by ♡˖GYURI˖♡ 2024. 5. 30.
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

이해하기

길이를 1부터 elements의 길이까지 늘려가며 연속 부분 수열을 만들고, 각각의 합을 저장하는 문제이다.

단, 중복이 없어야 한다고 했으니 Set을 활용하면 될 것 같은데... 연속 부분 수열 부분에서 막혔다.

 

참고한 블로그⬇️

 

[Java/자바] 프로그래머스 Lv2 - 연속 부분 수열 합의 개수 (Set)

문제 설명 철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니

hstory0208.tistory.com

 

 

문제풀이

import java.util.*;

class Solution {
    public int solution(int[] elements) {
        Set<Integer> set = new HashSet<>();
        
        int start = 1;
        while (start <= elements.length) {
            for (int i = 0; i < elements.length; i++) {
                int value = 0;
                for (int j = i; j < i + start; j++) {
                    value += elements[j % elements.length];
                }
                set.add(value);
            }
            start++;
        }
        
        return set.size();
    }
}

 

        int start = 1;

 

길이가 1부터 시작이기에 start = 1

 

        while (start <= elements.length) {
            for (int i = 0; i < elements.length; i++) {
                int value = 0;
                for (int j = i; j < i + start; j++) {
                    value += elements[j % elements.length];
                }
                set.add(value);
            }
            start++;
        }

 

길이가 1부터 elements.length일 때까지 while문을 순회한다.

내부 for문에서 elements를 순회하며 value를 구하는데, 이 때 j = i 부터 j < i + start까지의 값을 구하여 set에 저장한다.

그렇게 구한 j 값이 elements.length를 넘을 수도 있으니 모듈러 연산을 해준다.

 

이 부분의 구현이 어렵게 느껴졌다ㅠ

 

set.add(value) 해주면 중복은 당연히 처리되고, 이중for문을 다 돌고 나면 start값이 ++된다.

 

        return set.size();

 

마지막에 set.size()를 반환하면 끝