https://school.programmers.co.kr/learn/courses/30/lessons/131701
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
철호는 수열을 가지고 놀기를 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어 졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7,9,1,1,4]로 원형 수열을 만들면 다음과 같습니다.

원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형수열의 연속 부분 수열의 합으로 만들 수 있는 수의 개수를 return 하도록 solution함수를 완성해주세요.
풀이 생각하는 과정
- 제한 사항에 elements의 길이의 최대 1000으로 이중반복문을 돌리더라도 시간 제약에 걸리지 않을 것이라고 생각해 반복문을 사용해 풀이하였습니다.
- elements의 원소의 최댓값이 1000이고, 최대 1000개의 길이가 있을 것을 생각해 봤을 때 모든 원소의 합이 최대 1,000,000으로 long형으로 선언해주지 않아도 됩니다.
풀이 과정
- 연속 부분수열의 합을 저장하기 위해 HashSet을 사용합니다.
- 연속된 부분수열의 시작점을 elements의 0번째 원소로 지정합니다.
- 시작점만으로도 연속된 부분수열이기 때문에 시작점을 set에 넣습니다.
- 시작점부터 연속되는 다음 원소의 합을 구하고, 그 값 또한 set에 넣습니다.
- 4번의 과정을 elements의 원소를 다 더할 때까지 반복합니다.
- 다시 2번으로 돌아가 시작점을 1번 원소로 지정하고 3-5 과정을 반복합니다.
- 시작점 또한 elements의 마지막 원소까지 과정을 진행합니다.
- 반복문이 종료된 후, 연속부분수열의 합이 모두 저장된 set의 size를 return 합니다.
전체 코드
import java.util.*;
class Solution {
public int solution(int[] elements) {
Set<Integer> total = new HashSet<>();
for(int start=0;start<elements.length;start++){//합의 시작점
int sum=elements[start];
total.add(sum);
for(int i=1;i<elements.length;i++){ //연속되는 부분 수열
//원형 수열로 index값이 배열을 넘어가게 하지 않기 위해 idx 처리해줌.
int idx = (start+i)%elements.length;
sum+=elements[idx];
total.add(sum);
}
}
return total.size();
}
}'Algorithms(CT) > Programmers' 카테고리의 다른 글
| [프로그래머스] Lv.4 징검다리 (Java) (0) | 2023.06.26 |
|---|---|
| [Java] Lv.2 N진수 게임 (0) | 2023.06.24 |
| [프로그래머스][Java] Lv.2 k진수에서 소수 개수 구하기 (0) | 2023.06.22 |
| [프로그래머스] Lv2. 뉴스 클러스터링 (Java) (0) | 2023.06.21 |
| [프로그래머스] Lv.2 n^2 배열 자르기 (Java) (0) | 2023.06.19 |