[TIL] 알고리즘 문제풀이 23.06.01

이상훈·2023년 6월 2일
0

[내일배움캠프]

목록 보기
16/68
post-thumbnail

연속된 수의 합

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

  • 첫 항을 구하는 공식을 몰라서 팀원과 맨땅에 헤딩을 했다
  • 우리는 규칙을 찾아 중간값을 구하고 좌우측으로 인자를 붙여주는 방식으로 진행했다

나의 문제풀이

function solution(num, total) {
    let pointNum = 0;
    let arr = [];
    let idx = 0;
    
    if (num % 2 !== 0) {
        pointNum = total / num;
        arr.push(pointNum);
        for(cnt=1; cnt<num; cnt+=2) {
            idx++;
            arr.push(pointNum + idx)
            arr.unshift(pointNum - idx)
        }
    } else {
        pointNum = total/(num/2)
        for(cnt=0, idx=0; cnt<num; cnt += 2, idx++) {
            arr.push(Math.ceil(pointNum/2) + idx)
            arr.unshift(Math.floor(pointNum/2)-idx)
        }
    } 
    return arr
}

홀수의 경우 total에 num을 나눠서 센터값을 구해주고, 센터값을 기준으로 앞 뒤로 인자를 넣어주는 방식으로 코드를 구성했다.
짝수는 홀수와 조금 다르지만 작동방식은 동일하다고 보면 된다.

열심히 오류와 함께하면서 다풀고 난 후 아무리 생각해도 이렇게 푸는게 아닌거 같아서 다른사람의 풀이를 봤다.
다른 사람의 문제풀이

function solution(num, total) {
    const a = (2 * total / num + 1 - num) / 2
    return Array(num).fill().map((_, i) => i + a)
}
  • 첫번째로 너무 간결하게 작성한것에 대해서 1차로 현타가 왔고
  • 첫 항을 구하는 공식이 의외로 간단했다. 위의 코드를 보면 상수 a를 선언하고 첫항을 구한후 fill()메소드로 채워주는 방식으로 구현했다.

알고리즘 문제를 10문제정도 풀었는데 가장 기억에 남는 문제라 남겨본다. 저 문제를 풀겠다고 등차수열이랑 가우스 알고리즘도 찾아보고 생각도 잘 안나는 옛날에 배웠던 공식이라 더 헤맸던것 같다.

profile
코린이

0개의 댓글