[프로그래머스] - lv.0 - 연속된 수의 합

엘크·2023년 9월 22일
0

programers

목록 보기
8/9
post-custom-banner

문제 설명


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

제한 사항


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

입출력 예


312[3,4,5]
515[1,2,3,4,5]
414[2,3,4,5]
55[-1,0,1,2,3]

입출력 예 설명


내가 푼 답


function solution(num, total) {
  const result = [];
  
  // 중앙 숫자가 정수인 경우
  if (total % num === 0) {
    // 중앙 숫자 계산
    const middle = Math.floor(total / num);

    // 중앙을 기준으로 좌우로 num/2 개의 숫자를 더해줌
    for (let i = 0; i < num; i++) {
      result.push(middle - Math.floor(num / 2) + i);
    }
  } else { // 중앙 숫자가 소수인 경우
    const leftMiddle = Math.floor(total / num);
    const rightMiddle = Math.ceil(total / num);

    // 왼쪽 숫자부터 추가
    for (let i = 0; i < num / 2; i++) {
      result.unshift(leftMiddle - i);
    }

    // 오른쪽 숫자 추가
    for (let i = 0; i < num / 2; i++) {
      result.push(rightMiddle + i);
    }
  }

  return result;
}

Code Flow


생각하기

  • 연속된 수 num 만큼 더해서 total을 완성하는 작업.
  • 생각해봤는데, total에서 num을 나눴을때 나오는 숫자가 중앙 숫자고, num을 기준으로 index[중앙숫자-i] + index[중앙숫자+i] 만큼 해주면 되는게 아닐까?
  • 그리고 소숫점으로 나오면, 중앙숫자가 그 중앙의 2개인거임. ex) 3.5로 나오면 중앙숫자가 3/4를 중앙값로 삼고, 다시 index[중앙숫자-i] 와 index[중앙숫자+i] 하면 되는거지.
  • 다만 왼쪽 오른쪽으로 다시금 나뉘었으니 i < num/2 해야함.

다른 해답은 없을까?



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;});
}

예제 4번을 기준으로 보자.

  1. min 계산
  • 3.5 - 2 = 1.5 => ceil으로 min은 2가 된다.
  1. max 계산
  • 3.5 + 2 = 5.5 => floor로 max는 5가 된다.
  1. Array를 통해 배열을 만들어주고, 그것을 fill을 통해 채워준다, 그 후 map을 통해 i + min 값을 출력한다.

기억할 함수

.Map(el, idx, arr) : 원본 데이터를 변형하지 않고, 새로운 함수를 만들어 낸다.

- element: 현재 요소의 값
- index: 현재 요소의 인덱스
- array: 원본 배열 자체
profile
꾸준하게 하면 된다 언젠가는..?
post-custom-banner

0개의 댓글