본문 바로가기
프로그래머스/Lv.0

코딩테스트 연습 > 연속된 수의 합 - JAVA

by 아찌방 2023. 1. 17.

 

 

 

문제 설명

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

 


제한사항

  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

 


입출력 예

num total result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
4 14 [2, 3, 4, 5]
5 5 [-1, 0, 1, 2, 3]

 


 

입출력 예 설명

입출력 예 #1

  • num = 3, total = 12인 경우 [3, 4, 5]를 return합니다.

입출력 예 #2

  • num = 5, total = 15인 경우 [1, 2, 3, 4, 5]를 return합니다.

입출력 예 #3

  • 4개의 연속된 수를 더해 14가 되는 경우는 2, 3, 4, 5입니다.

입출력 예 #4

  • 설명 생략

코드

 

public static int[] solution(int num, int total) {
        int[] answer = new int[num];
        int start = 0;
        
        while(true) {
        	int sum = 0;
        	for(int i = start; i < start + num; i++) {
        		sum+=i;
        	}
        	if(sum == total) {
        		for(int i = 0; i < num; i++)
        		{
        			answer[i] = start;
        			start++;
        		}
        		break;
        	}
        	else if(sum < total) {start++;}
        	else {start--;}
        }
        
        return answer;
}​

 

 

풀이

 

num만큼 연속된 수로 total의 합이 된다는 것은

즉 num = 3 일때

{1, 2, 3} 이나 {4, 5, 6} 처럼 연속되는 3개의 수의 합이

total 이 되어야 하는 것이다.

 

그래서 num = 3, total = 12 이면

3 + 4 + 5 = 12 이기에 

이 {3, 4, 5} 를 찾아야 하는 것이다.

 

그러면 어떻게 할까 생각했는데

처음에 0(start) 부터 num까지의 합을 now total이라고 합시다.

이때 start가 1 더해지면 now totoal이 num 만큼 늘어나고

1 빼지면 now total이 num 만큼 줄어드는 것을 볼 수 있었다.

 

그래서 now total을 total 값과 비교해서

적으면 start + 1 을,

크면 start - 1을 해준다.

 

이렇게 차근차근 찾아가다보면 원하는 결과를 얻을 수 있습니다.

 

이를 이용해서 약간 수식처럼 만들어볼 수도 있는데요.

 

public static int[] solution(int num, int total) {
        int[] answer = new int[num];
        int start = 0;
        int sum = 0;
        for(int i = start; i < start + num; i++) {
    		sum+=i;
    	}
        start += (total-sum)/num;
        for(int i = 0; i < num; i++) {
    		answer[i]=start;
    		start++;
    	}
        return answer;
    }

 

 

풀이

 start = 0 으로 해서 

now total, 현재의 총합이 now total 이라고 할때

now total 은 결국 num 씩 커진다고 위에서 말했죠?

그러면 결국

(toal - now toal) / num 이 반복 되는 횟수가 되고

그것을 start에 더해주면

시작하는 숫자를 알게됩니다!!!!

 

앞에서 말한 방법과 결국에는 같은 맥락입니다.

좋은 방법을 선택해세요 ㅎㅎ

 

다음에 또 봐요

 

 

728x90