※ 저의 풀이는 정답이 아니며 저의 학습 과정을 남기는 목적으로 제작하는 포스팅입니다.

 문제

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


제한사항

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

 

 풀이

 

일단 로직이 머리속 계산만으로는 되지 않아서 무식한 방법을 사용했다.

 

answer[0] 
answer[1] = answer[0] + 1
answer[2] = answer[1] + 1
answer[3] = answer[2] + 1
...
answer[num] = answer[num-1]+1 = answer[0]+num-1

이라는 식으로 도식화를 해보니 팩토리알이 떠올랐다.


        
if num==8 total==12
만약에 num8 이라 8개의 인덱스가 생성 되었다면
[1 2 3 4 5 6 7 8] (여기 있는 숫자는 예시이고 아직 배열에 넣지도 않았다.)
로 만들어질 수 있겠다.

결론은
(num)의 ! 값을 total로 뺀 값을 num 으로 나눈 몫만큼 모든 항목을 빼주면 된다.
근데 여기서 우리는 위의 배열을 바로 만들지 않아도 된다.
정확히는 1 2 3 4 5 6 7 8의 값을 생각하지 않아도 된다
이미 1을 베이스로 한 상황이었기 때문에 배열의 시작값만 만들어주면된다.


그 말은 
answer[0] = 1 - 위에서 구한 값만 먼저 계산해내면 되고

answer[1] 은 1을 더하고... 이 과정에서만 for문을 주면 된다.

        
만약에
num 3  total 12 라면
배열은  [1 , 2 , 3]이라고 가정하고 (배열의 시작값을 언제나 1로 시작한다는 뜻이다.
3! 는 6이 나온다. total이 12이기 때문에 6-12=-6이 나온다.
여기서 -6을 3으로 나누고 그 값으로 빼기 때문에
그러면 우리는 answer[0]==1에 1-(-6/3) = 1-(-2) = 1+2로 맞게 실행이 될 것이다.

이제 로직은 간단해졌으니 다시 코드화시켜보자.

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];    // num만큼 answer의 배열을 선언해줍니다.
        
        int temp = 0;
        int fact = 0;
        
        // (num 값의 팩토리얼을 구해서 fact 라는 임시 변수에 넣습니다.)
        for(int i = 1; i<=num; i++){
            fact+=i;
        }
        
        temp = 1 - (fact-total)/num;
        
        for(int i = 0; i<num; i++){
            answer[i] = temp + i;
        }
        
        return answer;
    }
}

+ Recent posts