코딩테스트

[Level 0] 연속된 수의 합

nvvs 2022. 10. 24. 17:59

- 연속 된다면 첫번째 값을 찾는게 더 효율적이다..!

- 맨 처음 값을 찾자

 

문제 설명

연속된 세 개의 정수를 더해 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 int[] solution(int num, int total) {
        int[] answer = new int[num];
        
        int midNum = total / num;
        int lastIdx = num-1;
        int sum = 1;
        int temp = 1;
        
        for(int i = 0; i < num-1; i++){
            answer[i] = midNum + temp;
            
            if(i != 0 && i % 2 != 0){
                sum++;
                temp = (sum * -1);
            }
            
            temp *= -1;
        }
        
        answer[lastIdx] = midNum;
        Arrays.sort(answer);
        
        return answer;
    }
}

 

num이 3이고 total이 12이면 숫자 3개를 더해서 12가 나와야 한다.

내가 생각한 공식은 total을 num으로 나누고, 그 몫이 기준값이 되어 +1, -1, +2, -2...+(num-1), -(num-1) 순으로 더하는 것이었다.(굉장히 복잡^^;)

그래서 기준이 될 나눈 몫을 midNum으로 잡고 계속 증가하면서 더하고, 빼질 값을 sum으로 두었다. 그리고 -1을 곱해서 부호가 변경되어 실제로 연산되는 temp를 두었다.

sum과 temp를 따로 둔 이유는 sum에 바로 -1을 곱해서 양수, 음수로 만들면 하나씩 증가될 때 음수일 경우 -1에서 0으로 증가하게 되어 -1에서 1로 바뀌지 않게 되기 때문이다. (또 복잡^^;)

그렇게 해서 나온 숫자를 리턴할 배열에 담고, 실제 배열 길이보다 하나 덜 돌았기 때문에 남아있을 배열의 맨 끝에 midNum을 넣어준다. 그리고 Arrays 클래스의 sort() 함수로 오름차순으로 정렬해 리턴한다.(또, 또 복잡^^;)

 

복잡하다.

생각해보면 처음 시작하는 숫자만 구하면 그 이후부터는 배열 길이만큼 증가만 시키면 되는 구조다.

첫 시작 숫자를 구해서 for문을 돌리는게 더 효율적이다.

그런 풀이는 아래에 있다.

 

다른 풀이

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        int temp = 0;
        for(int i=0;i<num;i++){
            temp+=i;
        }
        int value = (total-temp)/num;

        for(int i=0;i<num;i++){
            answer[i]=i+value;
        }

        return answer;
    }
}

 

주어진 num의 배열 인덱스를 모두 더한다. 더한 값을 total에서 빼고 num으로 나누면 첫 번째 숫자를 구할 수 있다.

그 후에 배열 길이만큼 for문을 돌려 첫 번째 숫자를 증가시켜 배열에 넣으면 된다.

 

이렇게 쉬운걸

저렇게 어렵게

^^;

 

 

 

 

문제출처

- 프로그래머스 <Level 0 연속된 수의 합>