프로그래머스: 연속된 수의 합 (java)

MineeHyun·2024년 7월 2일

문제 풀이

목록 보기
10/25

문제 설명

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

풀이

  1. total / num으로 나눠 평균값을 얻는다. 산술 평균으로부터 앞뒤 몇 개라고 생각했음
  2. num이 짝수일 때와 홀수일 때를 구분한다. 홀수인 경우 산술 평균(mid)이 무조건 중간 index에 들어감.
  3. num이 짝수일 때에는: 2일 때와 2가 아닐 때를 구분한다. num이 2일 때 mid가 앞의 수인 경우와 뒤의 수인 경우가 있다고 생각했는데 풀이 쓰다 보니 아닌 듯... 아래에서 수정하겠음
  4. num이 짝수일 때에는 mid가 중앙보다 하나 앞에 오게 된다. 이를 기반으로 min을 구하고 answer에 min+i를 num개만큼 넣는다.
  5. num이 홀수일 때에는 mid가 중앙이다. mid - num/2 하면 가장 작은 값을 얻을 수 있다. answer에 min+i를 num개만큼 넣는다.

num을 짝/홀만 검사하는 풀이 (2인지 아닌지 검사하지 않음)

class Solution {
    public int[] solution(int num, int total) {
        int mid = total / num;
        int tmp = 0;
        int[] answer = new int[num];
        
       if (num % 2 == 0){
            int min = mid - num/2 + 1;
            for (int i=0; i<num; i++){
                answer[i] = min + i;
            }
            return answer;
        }
        
        int min = mid - num/2;
        for (int i=0; i<num; i++){
            answer[i] = min+i;
        }
        return answer;
    }
}

잘 통과된다.
6+7의 mid는 7이고 7+8의 mid도 7이라고 생각해서 (계?산실?수) 2인지 아닌지도 검사해야 한다고 생각했었음.

다른 사람들의 멋진 풀이

  • 시작 위치만 잘 잡아주면 answer에 num개만큼 연속된 숫자를 넣으면 된다.
  • 시작 위치를 어떻게 잡는가... => start = (total/num) - ((num-1)/2)
  • total/num = 중앙, (num-1)/2 = 시작 위치와 중앙의 차이
  • num이 홀수인 경우 (num-1)/2와 num/2가 같지만, num이 짝수이면 달라진다. 그래서 (num-1)/2를 해도 케이스 나누지 않고 짝/홀에 모두 적용할 수 있다.

참고한 글 링크

추가로 알게 된 것

자바도 C처럼 배열(array)을 한 번 생성하고 나면 길이를 변경할 수 없다.
요소를 추가하거나 삭제하려면 더 크거나 작은 배열을 만든 뒤 원래의 것을 새 것에 복사해 넣어야 한다.

자료형 [] 변수이름 = new 자료형[배열길이]; 와 같이 길이가 정해진 배열을 만들 수 있다.

0개의 댓글