[TIL] 2023.04.16 Programmers_연속된 수의 합

Today I Learned

  • Programmers 문제 풀기

 


Programmers 문제 풀기

연속된 수의 합

문제 설명

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

 

 

입출력 예

num total result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
5 5 [-1, 0, 1, 2, 3]

 

 

1차 풀이

function solution(num, total) {
    let array = Array(total+1).fill(0).map((v, i) => i);
    for (let i = 0; i < total; i++) {
        if (array.slice(i, i+num).reduce((acc, cur) => acc + cur, 0) === total) return array.slice(i, i+num);
    }
}

처음에는 결괏값에 음수가 들어는 경우는 고려하지 않고 풀어봤다.

  1. 1.  0부터 total까지를 배열로 생성한다. [0, 1, 2, 3, ....total]
  2. for문을 돌리면서 배열을 slice 메서드로 num 길이만큼 자른다. 
  3. 만약 slice로 자른 배열의 요소 총합이 total이라면 바로 그 배열을 return 한다.

 

이렇게 풀었을 때 배열의 요소에 음수가 들어간 케이스 빼고는 모두 통과했다.

 

 

최종 풀이

function solution(num, total) {
    let array = Array(total + num*2).fill(0).map((v, i) => i - num);
    for (let i = 0; i < array.length; i++) {
        if (array.slice(i, i + num).reduce((acc, cur) => acc + cur, 0) === total) return array.slice(i, i + num);
    }
}

음수인 경우까지 고려해서 Array에 넘기는 파라미터를 total + num*2로 수정한 후에 map 메서드에서 반환하는 값을 i-num으로 했다. 사실 굉장히 비효율적인 구조의 풀이라서 마음에 드는 풀이는 아니다. 일단 풀고 다른 사람들의 풀이를 보면서 많이 공부해야겠다. 아마 나와는 전혀 다른 구조로 풀지 않았을까..

 

 

다른 사람의 풀이

function solution(num, total) {
    const a = (2 * total / num + 1 - num) / 2
    return Array(num).fill().map((_, i) => i + a)
}

댓글 보니 가우스 공식을 사용한 풀이인 거 같다. 

 

가우스의 덧셈 공식 https://workshop-code.tistory.com/51