연속된 두 수의 합

nacSeo (낙서)·2024년 4월 4일
0

프로그래머스

목록 보기
141/169

문제 설명

연속된 세 개의 정수를 더해 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 div = total/num;
        if(answer.length%2==0) {
            answer[answer.length/2-1] = div;
        } else if(answer.length%2==1) {
            answer[answer.length/2] = div;
        }
        for(int i=answer.length/2; i>=0; i--) {
            answer[i] = div--;
        }
        for(int i=answer.length/2; i<answer.length; i++) {
            answer[i] = div++;
        }
        return answer;
    }
}

예시를 참고해서 머리를 굴려가며 짜봤는데 실패 🥲 어떻게 보면 알고리즘이 아니라 노가다 형식

  • 최종 코드
class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        int temp = 0;
        if(total%num == 0) {
            temp = total/num - num/2;
        } else {
            temp = total/num - num/2 + 1;
        }
        for(int i=0; i<num; i++) {
            answer[i] = temp++;
        }
        return answer;
    }
}

total/num - num/2라는 알고리즘을 생각해내는 게 너무 어려웠음

이 후 더 좋은 코드를 고민하다가, 삼항 연산자로 나타냈을 때 굳이 if ~ else문을 사용하지 않더라도 한 줄로 표현 가능

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        int temp = total/num - num/2 + (total % num == 0 ? 0 : 1);
        for(int i=0; i<num; i++) {
            answer[i] = temp++;
        }
        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;
        }
}
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;
    }
}

느낀 점

다양한 방법의 알고리즘으로 접근할 수 있는 문제였다. totalnum으로 나눴을 때 0이 아닌 경우를 따로 생각해야 하는 게 좀 골치아픈 문제다 🥲 알고리즘을 떠올리는 데에 많은 시간이 소모되면서 아직 많이 부족하다는 걸 느꼈고, 내가 직접 머리를 싸매서 만들어낸 코드 말고 다른 사람 코드들도 읽고 이해해보며 좀 더 컴퓨팅적 사고를 늘려가야겠다.

profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글