https://school.programmers.co.kr/learn/courses/30/lessons/131701
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.

원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
3 ≤ elements의 길이 ≤ 1,000
1 ≤ elements의 원소 ≤ 1,000
입출력 예
elements result
[7,9,1,1,4] 18
입출력 예 설명
입출력 예 #1
길이가 1인 연속 부분 수열로부터 [1, 4, 7, 9] 네 가지의 합이 나올 수 있습니다.
길이가 2인 연속 부분 수열로부터 [2, 5, 10, 11, 16] 다섯 가지의 합이 나올 수 있습니다.
길이가 3인 연속 부분 수열로부터 [6, 11, 12, 17, 20] 다섯 가지의 합이 나올 수 있습니다.
길이가 4인 연속 부분 수열로부터 [13, 15, 18, 21] 네 가지의 합이 나올 수 있습니다.
길이가 5인 연속 부분 수열로부터 [22] 한 가지의 합이 나올 수 있습니다.
이들 중 중복되는 값을 제외하면 다음과 같은 18가지의 수들을 얻습니다.
[1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22]
문제 해결을 위한 과정
이 문제의 핵심은 원형 수열을 어떻게 일반적인 선형 배열로 다룰 것인가? 입니다.
- 원형 수열 선형화 (newArr): 원형 구조를 쉽게 처리하기 위해 원본 배열을 두 번 이어 붙인 elements.length * 2 크기의 새로운 배열(newArr)을 만듭니다. 나머지 연산(i % len)을 사용하면 원래 배열의 원소들이 순환하며 두 번 반복되어 담기게 됩니다.
- 중복 제거용 자료구조 선택: 연속 부분 수열의 합 중 서로 다른 수의 개수를 세어야 하므로, 중복된 값을 허용하지 않는 HashSet 즉 집합을 사용합니다.
- 연속 부분 수열 합 계산:
- 바깥쪽 루프(i)는 부분 수열의 시작 인덱스를 결정합니다. 원래 배열의 길이(len)만큼만 돌면 모든 시작점을 체크할 수 있습니다.
- 안쪽 루프(j)는 시작점 i부터 수열의 최대 길이인 i + len 직전까지 1씩 늘려가며 숫자를 하나씩 더해줍니다(sum += newArr[j]).
- 숫자가 하나씩 누적될 때마다 set.add(sum)을 해줌으로써 길이가 1인 부분 수열의 합부터 길이가 len인 전체 수열의 합까지 자연스럽게 Set에 모두 저장됩니다.
- 모든 루프가 끝나면 set.size()를 통해 중복이 제거된 순수한 합의 가짓수를 반환합니다.
소스코드
import java.util.*;
class Solution {
public int solution(int[] elements) {
HashSet<Integer> set = new HashSet<>();
int answer = 0;
int len = elements.length;
int len2 = elements.length * 2;
int[] newArr = new int[len2];
for(int i = 0; i < len2; i++) {
newArr[i] = elements[i % len];
}
for(int i = 0; i < len; i++) {
int sum = 0;
for(int j = i; j < i + len; j++) {
sum += newArr[j];
set.add(sum);
}
}
answer = set.size();
return answer;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| n^2 배열 자르기(Level2 Java) (0) | 2026.07.14 |
|---|---|
| 프로그래머스 이진 변환 반복하기 (Level2 Java) (0) | 2026.07.06 |
| 프로그래머스 N개의 최소공배수 (Level2 Java) (0) | 2026.06.30 |
| 프로그래머스 멀리 뛰기 (Level2 Java) (0) | 2026.06.28 |
| 프로그래머스 숫자와 표현 (Level2 Java) (0) | 2026.06.27 |