본문 바로가기
코딩 문제/프로그래머스 [ JavaScript ]

[ 프로그래머스 / JavaScript ] 숫자의 표현

by CODESIGN 2022. 9. 29.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

Finn은 요즘 수학 공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현하는 방법이 여러 개라는 사실을 알게 되었습니다. 예를 들어 15는 다음과 같이 4가지로 표현할 수 있습니다.

  • 1 + 2 + 3 + 4 + 5 = 15
  • 4 + 5 + 6 = 15
  • 7 + 8 = 15
  • 15 = 15

자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return 하는 solution를 완성해주세요.

 

제한사항

  • n은 10,000 이하의 자연수 입니다.

 

입출력 예

n result
15 4

 

입출력 예 설명

입출력 예#1
문제의 예시와 같습니다.


나의 문제 풀이

처음에는 for loop을 n만큼 돌리니 시간 초과가 떴다.

그래서 n의 1/2만큼만 돌게 했다. 

주어진 예제의 예를 들자면 

n = 15일 때의 경우의 수는 4가지라고 했다.

  • 1 + 2 + 3 + 4 + 5 = 15
  • 4 + 5 + 6 = 15
  • 7 + 8 = 15
  • 15 = 15

이때 8부터는 8+9 = 17이므로 더 이상 확인할 필요가 없어서이다.

 

total(더해진 값)이 n 이상일 때 break를 걸어주었고 total이 n과 같을 때 answer의 수를 늘려줬다.

 

마지막에  return n == 1 ? 1 : ++answer; 을 추가해준 이유는 test case 중에 n = 1일 경우가 추가되어있다.

그래서 n이 1일 경우 1만 리턴하고 아닌 경우에는 answer에 1을 더해줬다.

그 이유는 n, 본인도 포함하기 위해서이다.

 

function solution(n) {
    var answer = 0;
    var boundary = n/2+1;
    for (let i = 1; i < boundary; i++) {
        var total = 0;
        for (let j = i; j < boundary; j++) {
            total += j;
            if (total > n) {
                break;
            } else if (total == n) {
                answer++;
                break;
            }
        }
    }
    return n == 1 ? 1 : ++answer; 
}

 

 


다른 풀이

홀수인 약수의 개수를 구하여 문제를 풀었다.

너무 수학적으로 풀어서 이런 접근은 생각도 못했다...

코드도 훨씬 간결하고 runtime도 훨씬 효율적이다.

 

function solution (num) {
    var answer = 0;

  for(var i=1; i<=num; i++) {
    if (num%i == 0 && i%2 == 1)
      answer++
  }
    return answer;
}

 

반응형

댓글