Javadocs

[ Programmers ]Lv.0 연속된 수의 합 (JAVA) 본문

SelfStudy/Programmers(코딩테스트)

[ Programmers ]Lv.0 연속된 수의 합 (JAVA)

Javatist 2023. 2. 26. 15:13

https://school.programmers.co.kr/learn/courses/30/lessons/120923

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[ 문제 설명 ]

연속된 세 개의 정수를 더해 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]

 

import java.util.Arrays;

class Solution {
    public static int[] solution(int num, int total) {
        
		int[] answer = new int[num];		// 배열 answer 생성
		int sum = 0;
		int start = 0;
        
        for (int i = 1; i < num; i++) {
        	sum += i;
        }
        // 첫번째 항을 구하는 식.
        start = (total - sum) / num;
        // answer 배열에 반복문을 통하여 배열에 요소 추가.
        for (int j = 0; j < num; j++) {
        	answer[j] = start + j;
        	
        }
        System.out.println(Arrays.toString(answer));
        
        return answer;
    }
}

[ 풀이 설명 ]

Ex. num(항의 개수) = 5, total(등차수열의 합) = 15 라 가정해보자.

공차가 1인 등차수열을 생각해서 각 항은 x, x+1, x+2, x+3, x+4 이고 각 항들을 더하면 5x + 10이 나온다.

즉, 5x + 10 = 15로 정리가 된다.

여기서 일반식으로 정리해본다면 

첫번째 for문의 경우는 예시에서 '10', 일반식에서는 '시그마'를 구하는 식이고 그 결과값을 sum 이라고 정의해준다. 

그리고 일반식에서 첫째항 start를 남기고 전부 이항을 시켜준다 => start = (total - sum) / num 

 

그 다음 두번째 for문에서 첫째항(start)을 넣어서 배열 answer을 구하여 준다.  


[ 두번째 풀이 ]

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        
        int sum = num * (1 + num) / 2;			// 첫번째항을 '1'로 정하고 num까지의 합
        int start = (total - sum) / num;		// 총합에서 sum을 뺀 후 남은 수만큼 균등하게 분배하기 위함

        for(int i=1; i<num+1; i++){
                answer[i - 1] = i + start;
        }
        
        return answer;
        
    }
}

 

[ 풀이 설명 ]

두번째 풀이는 등차수열의 합 공식을 사용해 보려고 한다.

1)

먼저 공식을 살펴보면  등차수열의 합  = 항의 개수 * (첫째항 + 마지막항) / 2 이다.

그리고 여기서 첫째항을 1이라고 가정할 것이고 그렇게 되면 항의 개수와 마지막항의 수는 같을 것이다.

다시 정리해보면 등차수열의 합(sum)  = 항의 개수(num) * (1 + 마지막항(num)) / 2 로 정리할 수 있다. 

2)

다음으로 이용할 개념은..

문제에서 주어진 예시를 들어 num = 3, total = 12를 이용해보자.

먼저 위에 1) 에서 첫째항을 '1'이라고 가정한다고 했다. 그래서 1부터 항의 개수가 3개인 수 까지 합을 구한다면

1 + 2 + 3 = 6이 나오게 되고 문제에서 주어진 합은 12이다. 여기서 우리가 구한 '6'은  문제에서의 합 '12' 보다 6이 부족하고 이 6을 균등하게 3개의 항으로 '2' 씩 분배하여 더해준다. 그러면 3 + 4 + 5 = 12가 나오게 된다. 

 

1), 2) 개념을 정리하여 코드로 작성하면 아래와 같이 나온다. 

int sum = num * (1 + num) / 2;
int start = (total - sum) / num;

나온 결과를 이용하여 for문을 이용하여 배열 answer에 넣어준다. 

 

Comments