C#

[프로그래머스 힌트/답/해석] 연속된 수의 합

Guk-blog 2024. 1. 30. 20:18
728x90
반응형

힌트

더보기

- 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]

- 규칙을 찾아보면 배열의 중간값은 합/연속된 숫자의 개수이다

[3, 4(12 / 3), 5] , [1, 2, 3(15 / 3), 4, 5] , [2,3(14 / 3), 4, 5], [-1, 0, 1(5 / 5), 2, 3]

홀수 개수라면 정중앙이 합/n이고, 

짝수 개수면 중앙 왼쪽이다.

정답

더보기

방법 1

 int[] answer = new int[num];

if(num%2==0){
    for(int i = 0; i < num; i++){
        answer[i] = (total / num) - (num / 2) + i + 1;
    }
}else{
    for(int i = 0; i < num; i++){
        answer[i] = (total / num) - (num / 2) + i;
    }
}
return answer;

방법 2

public static int[] Solution74(int num, int total)
{
    var numArr = Enumerable.Range(total / num - num, num * 2).ToArray();

    return FindTargetConsecutiveIntegers(numArr, num, total).OrderBy(x => x).ToArray();
}
static int[] FindTargetConsecutiveIntegers(int[] arr, int count, int total)
{
    List<int> answerList = new List<int>();

    for(int i=0; i < arr.Length - count + 1; i++)
    {
        var sum=0;
        answerList.Clear();

        for(int j = i; j < count + i; j++)
        {
            answerList.Add(arr[j]);
            sum += arr[j];

            if(sum > total)break;
        }

        if(total == sum) 
        {
            return answerList.ToArray();
        }
    }

    return new int[0];
}

해석

더보기

방법 1

if(num%2==0){
                for(int i = 0; i < num; i++){
                    answer[i] = (total / num) - (num / 2) + i + 1;
                }
            }

짝수 개수일 때

(total / num) - (num / 2) + i +1

힌트에서 본 예시를 대입하면 3(=14 / 4) - 2(=4 / 2) + i +1

else{
                for(int i = 0; i < num; i++){
                    answer[i] = (total / num) - (num / 2) + i;
                }
            }

홀수 개수일 때

(total / num) - (num / 2) + i

힌트에서 본 예시를 대입하면 4(12 / 3) - 1(3 / 2) + i

 i가 증가함에 따라 1씩 증가하는 연속된 숫자 배열이 만들어진다.

 

방법 2

var numArr = Enumerable.Range(total / num - num, num * 2).ToArray();

( total / num) - num 번째 부터 num * 2 개수 만큼 연속된 숫자를 생성한다

for(int j = i; j < count + i; j++)
                {
                    answerList.Add(arr[j]);
                    sum += arr[j];
                   
                    if(sum > total)break;
                }

반복문은 약속된 횟수 num만큼 반복시킨다 

리스트에 해당 숫자를 넣어주고 합산을 해준 후 합이 만약 약속된 합산보다 크다면 반복문을 빠져나온다

 if(total == sum)
                {
                    return answerList.ToArray();
                }

 합이 약속된 합과 일치한다면 해당 리스트를 리턴해준다

 

 

 

728x90
반응형