[Level 0] 연속된 수의 합
- 연속 된다면 첫번째 값을 찾는게 더 효율적이다..!
- 맨 처음 값을 찾자
문제 설명
연속된 세 개의 정수를 더해 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 연속된 수의 합>