IT/알고리즘

프로그래머스 - 숫자의 표현 (c++)

반응형

문제 설명

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 이하의 자연수 입니다.

풀이

1~n 까지 연속된 자연수의 합이 n이 되는 개수를 구해야한다.

cnt를 1부터 n 까지 증가시키면서 큐에 담고, cnt의 누적합을 sum에 더해나간다.

 

초기값 sum = 1, cnt = 1

 

1. sum이 n보다 작으면 cnt를 증가시키고 sum에 누적한 후 큐에 담는다.

2. sum이 n과 같으면 answer를 증가시킨다.

3. sum이 n보다 크거나 같으면 q의 front(맨 앞에서 더해준 cnt)값을 sum에서 빼준 후 q의 front를 제거한다.

4. q의 사이즈가 0이 될때까지 반복

#include <string>
#include <vector>
#include <queue>
using namespace std;

int solution(int n) {
    int answer = 0;
    queue<int> q;
    q.push(1);
    
    int sum = q.front();
    int cnt = q.front();
    while(!q.empty()){
        
        if(sum < n){
            sum += ++cnt;
            q.push(cnt);
        }
        
        if(sum == n) ++answer;
        
        if(sum >= n){
            sum -= q.front();
            q.pop();
        }
        
    }
    
    return answer;
}
반응형