본문 바로가기

Algorithm/Sweeping

(C++) - 백준(BOJ) 2018번 : 수들의 합 5

반응형

https://www.acmicpc.net/problem/2018

 

2018번: 수들의 합 5

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한

www.acmicpc.net

sliding window로 풀었습니다.

 

📕 풀이방법

📔 입력 및 초기화

 l = 1, r = 1로 출발합니다. 답을 출력할 변수 ans, 연속구간의 누적합을 저장할 변수 sum, 입력받을 변수 n을 선언합니다.

 

📔 풀이과정

 l <= r, r <=n 인동안 loop를 돌며 다음을 수행합니다.

 

1. 만약 연속구간의 합이 n보다 작다면 r을 더해줍니다.

 

2. 이상일 때는 sum==n인 경우아 sum > n인 경우가 있습니다. sum == n이라면 바로 ans를 더해줍니다. 아닌경우는 가장 왼쪽의 l값을 sum에서 제한뒤 l++해줍니다.

📔 정답출력

자기 자신도 답에 포함되므로 ans + 1을 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
int n,l=1,r=1,sum,ans;
int main(){
    cin >> n;
    while(l <= r && r <= n) {
        if(sum < n) sum += r++;
        else{
            if(sum == n) ans++;
            sum -= l++;
        }
    }
    cout << ans + 1;
}