개발/알고리즘(코딩테스트)

프로그래머스, 자바스크립트) 숫자의 표현

빔네모 2024. 11. 13. 23:32

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12924

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이

문제 접근을 생각해보면...1+2+3+4 연속된 자연수를 가져야 되니 일단 반복문을 돌려서 숫자를 준비한다.

그러면 1+2+3 ... , 2+3+4..., 이런식으로 처음 시작되는 숫자를 기준으로 더한 값을 구할 수 있다. 

n이 되는 연속 합을 찾기 위해 n이 되면 answer를 증가시키고 쓸데없는 반복이 없도록  n 이상이면 break

function solution(n) {
  let answer = 0;

  for (let i = 1; i <= n; i++) {
    //숫자 나열
    let sum = 0;
    for (let j = i; j <= n; j++) {
      //해당 숫자부터 n까지의 합
      sum += j;
      if (sum === n) answer++; //합이 n이면 answer 증가
      if (sum >= 15) break; //합이 15이상이면 탈출
    }
  }
  return answer;
}

다른 풀이

수학적 접근, 연속된 자연수의 합이 n이 되려면, 연속된 숫자의 합 공식을 이용할 수 있다.

(start+start+length1)×length/2=n. 
start는 연속된 자연수의 시작점, length는 연속된 자연수의 개수
  • 가능한 모든 length 값을 검사한다.
  • length * (length + 1) / 2 <= n 조건은 length가 지나치게 커져서 n을 넘지 않도록 제한한다.
  • (n - (length * (length - 1)) / 2) % length === 0 조건은 n에서 length의 합을 뺀 후 나머지가 0이 되는지 확인하여, 해당 length가 유효한 연속 합을 만드는지 검사한다. 나머지가 0이면 유효한 연속합이므로 answer를 증가
function solution(n) {
  let answer = 0;
  
  for (let length = 1; length * (length + 1) / 2 <= n; length++) {
    // 연속된 숫자의 개수에 따라 시작점을 구함
    if ((n - (length * (length - 1)) / 2) % length === 0) {
      answer++;
    }
  }

  return answer;
}