코드
import java.util.*;
import java.util.stream.IntStream;
// n 값이 될 수 있는 연속된 자연 수 합 구하기
class 연속된자연수합 {
public static void main(String[] args) {
int n = 1000;
int answer = 0, sum = 0;
int m = n / 2 + 1; //2개 이상의 연속된 자연수의 합은 절반 정도만 필요
int[] arr = IntStream.rangeClosed(1, m).toArray();
//rt를 담당하는 외부 반복문
for (int rt = 0,lt = 0; rt < m; rt++ ) {
sum+= arr[rt];
//lt를 담당하는 내부 반복문
//n보다 sum이 크거나 같을때.
while(n<=sum) {
//sum이 n과 같다.
if(sum==n) {
prettyPrint(arr, lt, rt);
answer++;
sum-=arr[lt++];
//sum이 n보다 크다.
}else {
sum-=arr[lt++];
}
}
}
System.out.println(answer);
}
static void prettyPrint(int[] arr, int lt, int rt) {
System.out.print("[lt="+lt+" rt="+(rt)+"]");
Arrays.stream(arr, lt, rt+1).forEach(n->System.out.print(n+","));
System.out.println();
}
}
결과
[lt=27 rt=51]28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,
[lt=54 rt=69]55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,
[lt=197 rt=201]198,199,200,201,202,
3
여기서 while은 특정 조건에만 반복한다. 따라서 시간복잡도는 이중반복문과는 다르다.
'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글
모든 아나그램 찾기 (0) | 2022.11.30 |
---|---|
K번째 큰 수 (0) | 2022.11.27 |
연속부분수열 (0) | 2022.11.23 |
교집합 (0) | 2022.11.20 |
두배열합치기 (0) | 2022.11.17 |