PS/프로그래머스 입문 100제

[프로그래머스] LV.0 연속된 숫의 합 - 자바 [96/100]

yaho!! 2024. 7. 12. 13:49

💬 문제 설명

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

 

🚫 제한 사항

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

 

📢 입출력 예

 

👨‍🏫 입출력 예 설명

 

📃 제출 코드

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        int start = 0;
        
        for (int i = -1000; i <= total; i++) {
            int startNum = i;
            int result = 0;
            
            for (int j = 0; j < num; j++) {
                startNum += 1;
                result += startNum;
            }
            
            if (result == total) {
                start = i + 1;
                break;
            }
        }
        
        for (int i = 0; i < answer.length; i++) {
            answer[i] = start + i;
        }
        
        return answer;
    }
}

 

✏ 해결방법 & 배운점

시작 숫자 찾기

  • -1000부터 total까지의 숫자 i를 순회합니다.
  • startNum 변수는 현재 시작 숫자를 저장합니다.
  • result 변수는 현재 시작 숫자부터 연속된 `num` 개의 숫자의 합을 저장합니다.

 

연속된 숫자의 합 계산

  • `num`개의 연속된 숫자를 더하여 `result`에 저장합니다.
  • `startNum`은 매 반복마다 1씩 증가하여 다음 숫자를 더합니다.

결과 비교

  • result가 total과 같으면, start를 현재 시작 숫자의 다음 숫자로 설정하고 루프를 종료합니다.
  • start는 실제 배열의 시작 숫자가 됩니다.

 

결과 배열 채우기

  • `start`부터 `num`개의 숫자를 `answer` 배열에 저장합니다.
  • answer[i]에 start + i 값을 저장하여 연속된 숫자를 생성합니다.

++) 다른 사람 풀이 리뷰

class Solution {
        public int[] solution(int num, int total) {
                int[] answer = new int[num];
                int check = num*(num+1) / 2;
                int start = (total - check) / num + 1;
                for (int i = 0; i < answer.length; i++) {
                        answer[i] = start + i ;
                }
                return answer;
        }
}

기본 합 계산:

  • `int check = num * (num + 1) / 2;`를 통해 1부터 num까지의 합을 구합니다.
  • 이는 가우스의 합 공식을 사용하여 구합니다. 예를 들어, num이 4일 경우, check는 10이 됩니다.

 

시작 숫자 계산

  • `int start = (total - check) / num + 1;` 을 통해 시작 숫자를 계산합니다.
  • `total - check` 는 주어진 total에서 1부터 num까지의 합을 뺀 값입니다.
  • 이 값은 연속된 숫자들이 더해져야 할 값의 총 합을 나타냅니다.
  • 이 값을 num으로 나누고 1을 더하는 이유는, 시작 숫자부터 num 개의 연속된 숫자를 만들기 위함입니다.

 

반복문을 통한 배열 채우기

  • `for (int i = 0; i < answer.length; i++) { answer[i] = start + i; }` 을 통해 배열 answer를 채웁니다.
  • 시작 숫자 start부터 시작하여 숫자를 하나씩 증가시키면서 배열을 채웁니다.

 

결과 반환:

  • 완성된 배열 answer를 반환하여 결과를 출력합니다.

num이 5이고 total이 35인 경우

check 계산

  • check = 5 * (5 + 1) / 2 = 15
  • 따라서, 1부터 5까지의 합은 15입니다.

시작 숫자 계산

  • start = (35 - 15) / 5 + 1 = 5
  • 즉, 시작 숫자는 5입니다.

배열 채우기

  • answer = {5, 6, 7, 8, 9}

이렇게 해서 총 5개의 연속된 숫자들의 합이 35가 되도록 배열이 생성됩니다.


가우스 합 공식

  • 연속된 숫자의 합을 구하는 기본적인 방법은 가우스 합 공식으로 구할 수 있습니다.
  • 연속된 숫자의 합 = $\frac{n * (n+1)}{2}$
  • 이 공식을 사용하면 1부터 n까지의 합을 빠르게 계산할 수 있습니다.

1부터 4까지의 합 구하기

  • $1 + 2 + 3 + 4 = \frac{4 * (4+1)}{2} = \frac{4 * 5}{2} = 10$
  • 따라서, 1부터 4까지의 합은 10입니다.

이 공식을 통해 연속된 숫자의 합을 쉽게 계산할 수 있습니다.