[js] 연속된 수의 합

sookyoung.k·2024년 6월 26일
1
post-thumbnail

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

제한사항

  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

나의 풀이

function solution(num, total) {
    // 정수 배열의 첫 번째 값 구하기 
    let sum = (num - 1) * num / 2;
    let el = (total - sum) / num;
    
    return Array.from({ length: num }, (_, idx) => el + idx);
}

연속되는 숫자니까... 정수 배열의 첫 번째를 구하면 쉽지 않을까 생각하고 접근했다.

  1. 첫 번째 숫자는 모르는 상황에서 다음 인덱스, 다다음 인덱스, ...와의 차이를 더하여

    • 합한 값을 구하여 sum에 할당했다. 이는 1부터 n까지의 정수의 합이 될 것이다. 가우스의 덧셈 공식을 활용해서 (정식 명칭 찾아봄) 구해준다. ➡️ n * (n+1) / 2
  2. 첫 번째 원소를 구한다.

    • total에서 첫 번째 원소와의 차이의 합(sum)을 다 빼면 첫 번째 원소를 num번 만큼 곱해준 값이 될 것이다. 따라서 num으로 나누어 첫 번째 원소의 값을 구한다.
  3. 첫 번째 원소부터 연속한 정수의 배열을 구하여 반환한다.

    • Array의 길이는 num이 될 것이다. Array.from()의 첫 번째 인자로 { length: num}을 준다.
    • 그 안을 el부터 1씩 증가한 값으로 채워준다. 인덱스 값을 더해주면 된다. ➡️ 두 번째 인자로 (_, idx) => el + idx)

다른 풀이 1

function solution(num, total) {
    var min = Math.ceil(total/num - Math.floor(num/2));
    var max = Math.floor(total/num + Math.floor(num/2));

    return new Array(max-min+1).fill(0).map((el,i)=>{return i+min;});
}
  1. minmax 값을 구한다. 연속된 숫자의 범위를 설정하는 데 사용된다.
    • 평균(total/num)에서 num의 절반 값을 뺀 후 올림하면 최소값이고, 절반값을 더한 후 내림하면 최대값이다. 이게... 이렇게 되는구나? 이해하기보단 그냥 외울래... 흑흑
  2. 배열을 생성하여 반환한다.
    • 연속될 숫자의 개수만큼 배열을 생성한다. ➡️ new Array(max - min + 1)
    • 생성된 배열을 0으로 초기화한다.
    • 배열의 각 요소를 min부터 시작하여 i씩 증가하는 값으로 변환한다. ➡️ map((el,i)=>{return i+min;}

다른 풀이 2

function solution(num, total) {
    const a = (2 * total / num + 1 - num) / 2
    return Array(num).fill().map((_, i) => i + a)
}
  1. 시작 숫자 a를 계산한다.
    • 어... 저게 연속된 숫자들의 합을 구하는 공식...인 것 같다. 하 지금 수식을 이해하고 싶지 않아...
  2. 이후 배열 생성 부분은 위와 같다.
profile
영차영차 😎

0개의 댓글