새소식

반응형
Language/알고리즘

백준 BaekJoon 1024번: 수열의 합 [Java] 자바

  • -
반응형

2020-09-17


문제

N과 L이 주어질 때, 합이 N이면서,

길이가 적어도 L인 가장 짧은 연속된

음이 아닌 정수 리스트를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 L이 주어진다.

N은 1,000,000,000보다 작거나 같은 자연수이고,

L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

출력

만약 리스트의 길이가 100보다 작거나 같으면,

연속된 수를 첫째 줄에 공백으로 구분하여 출력한다.

만약 길이가 100보다 크거나 그러한 수열이 없을 때는 -1을 출력한다.


소스코드

		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int l = scan.nextInt();
		int min = 100;
		// l보다는 크고 100보다는 작은 연속합의 최소횟수 체크
		int sum = 0;
		// n과 비교할 연속합이 저장됨
		int count = 0;
		// sum에 더해지는 횟수를 계산
		int temp = 0;
		// 배열에 저장될 임시값이 들어갈 변수
		int [] arr = new int [n];
		// 연속합에 사용되는 숫자가 저장될 변수
		
		for(int i = 1; i < n/2; i++) {
			sum = 0;
			count = 0;
			temp = 0;
			
			loop :for(int j = i; j < n/2; j++) {
				if(sum < n) {
					sum += j;
					count++;
					// n과 같아지기 위해서 지속적으로 sum에 더해줌 
					if(sum == n)  {
						if(min >= count  && count >= l) {
						Arrays.fill(arr,0);
						//최솟값을 찾았음으로 배열의 있는 수를 0으로 초기화
						min = count;
						temp = i;
						//연속합의 초기값 i로 지정
						for(int k = 1; k <=count; k++) {
							arr[k] = temp;
							temp++;
							//count 값 만큼 배열에 저장
							}
						}else {
							break loop;
						}
					}
				}
			else {
				break loop;
				}
			}
		}
		
		Arrays.sort(arr);
		//올림차수 정렬
		
		if(arr[n-1] == 0) {
			System.out.println(-1);
			//연속합이 되는지 여부 체크
			//연속합이 될경우 마지막에 무조건 0보다 큰 값이들어감
		}else {
		for(int i = 0 ; i < n; i++) {
			if(arr[i] != 0) {
			System.out.print(arr[i]+ " ");
			}
		}
	}	

 

출처 링크 : www.acmicpc.net/problem/1024

 

1024번: 수열의 합

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

www.acmicpc.net

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.