프로그래머스 코딩테스트 연습 회고록 - 2일차

H.GOO·2022년 11월 27일
0
post-thumbnail

프로그래머스 Lev.0 "연속된 수의 합"

문제 설명

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

제한사항

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

입출력 예 설명




나의 풀이

내가 생각한 알고리즘은 다음과 같다.

  1. 먼저 연속된 여러 개의 정수 중 첫 번째 숫자를 구한다.

    // 연속된 여러 개의 정수의 합 = total
    (x) + (x+1) + (x+2) ... + (x+num) = total
    
    // num 으로 묶기
    (num * x) + (num * (num - 1)/2) = total
    
    // 양변을 num 으로 나눠주기
    x + (num-1)/2 = total / num
    
    // 첫 번째 수 x (내 코드에서는 n1 값) 구하기
    x = total / num - (num-1) / 2
  2. 최종으로 for 문에서 answer 배열을 구한다.


function solution(num, total) {
  let answer = [];
  const n1 = total / num - (num - 1) / 2; // 연속된 세 개의 정수 중 첫 번째 숫자

  for (let i = 0; i < num; i++) {
    answer.push(n1 + i);  // n1부터 num개 만큼 배열에 추가
  }
  return answer;
}



다른 사람 풀이 및 느낀점 - 1

// 출처: 프로그래머스 Apensia 님 풀이

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

// return 부분 해석
// Array(num)  >>  [ <3 empty items> ]
// Array(num).fill()  >>  [ undefined, undefined, undefined ]

느낀점

  • 연속된 여러 개의 정수 중 첫 번째 숫자를 구하는 방법은 똑같았다.
  • for 문을 사용하지 않고 Array, fill, map을 사용하여 답을 구하니 for 문이 필요없이 간단했다.


다른 사람 풀이 및 느낀점 - 2

// 출처: 프로그래머스 J 님 풀이

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

// Math.ceil(x)  >>  x 보다 크거나 같은 가장 작은 정수
// Math.floor(x)  >>  x 보다 작거나 같은 가장 큰 정수

느낀점

  • 이번 풀이는 최소값, 최대값을 사용하였다.
  • 메소드는 이해했지만 공식을 완벽하게 이해하지 못했다. 해석 후 다시 포스팅을 해보겠다!

0개의 댓글