[코딩테스트연습] 코딩테스트 입문 > Lv.0 연속된 수의 합

2024. 3. 23. 13:23코딩 테스트/[프로그래머스] Java

문제 설명


문제 풀이

가장 먼저 떠오른 생각은 바로 total을 num으로 나눈 값이 result의 중간 값이 된다는 것이었다.

이 규칙을 활용해서 어떻게 해결할지 고민해보았다.

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        
        int center_val = (int)total/num;
        int center_idx = (int)num/2;
        
        if(num%2!=0){ //num이 홀수인 경우,
            //중간~끝
            for(int i=center_idx; i<num; i++){
                answer[i] = center_val;
                center_val++;
            }
            center_val = (int)total/num;
            center_idx = (int)num/2;
            //시작~중간
            for(int i=center_idx; i>=0; i--){
                answer[i] = center_val;
                center_val--;
            }
            
            
            
        }else{ //num이 짝수인 경우,
            center_val = (int)total/num+1;
            //중간~끝
            for(int i=center_idx; i<num; i++){
                answer[i] = center_val;
                center_val++;
            }
            center_val = (int)total/num+1;
            center_idx = (int)num/2;
            //시작~중간
            for(int i=center_idx; i>=0; i--){
                answer[i] = center_val;
                center_val--;
            }
            
        }
        
        
        return answer;
    }
}

다른 사람의 풀이를 보고 나니 멍...했다

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;
    }
}

등차수열 공식을 사용해서 가장 마지막 수를 check로 구한다.

이후 수열을 시작하기 위해 total-check를 /num으로 나눈 후 1을 더해서 시작 값을 구한다.

시작과 끝 값을 구했으니, for문을 이용해서 하나씩 넣어주면 끝이다..

 

여러 문제들을 풀다보니 수학적 머리가 필요함을 절실히 깨닫는 중이다..😭