[swexpert] 7510. 상원이의 연속합 (c++, 누적합)
728x90
반응형
n이 최고 10^6이므로 n^2은 시간초과로 O(n)으로 풀어줘야 되는 문제이다.
n=15일 때
1, 2, 3, ... ,15 를 하나씩 더하면 누적합은 1, 3, 6, 10, ... 이렇게 될 것이다.
6인 경우 1~6까지 누적합이 21이되어 15를 넘게 되면 앞에서부터 하나씩 빼준다 (연속합을 구하니깐)
21에서 1을 빼변 20, 2를 빼면 18, 3을 빼면 15가 되어 4+5+6=15 인 또 하나의 경우를 구할 수 있다.
그러니 시작이 어디부터 인지 나타내는 변수 s를 만들고 누적합이 15를 넘을 때마다 시작점을 1씩 증가시키면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
int n;
cin >> n;
int cnt = 0;
int s = 1;
int sum = 0;
for (int i = 1; i <= n; i++)//10^6
{
sum += i;
while (sum > n) {
sum -= s;
s++;
}
if (sum == n) {
cnt += 1;
}
}
cout <<"#"<<test_case<<" "<< cnt << endl;
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
728x90
반응형
'swexpert' 카테고리의 다른 글
[swexpert] 1248. 공통조상 (C++, 트리, BFS, DFS) (0) | 2021.10.12 |
---|---|
[SWEA] 2948. 문자열 교집합 (C++, 해시) (0) | 2021.10.06 |
[SWEA] 1256. K번째 접미어 (C++) (0) | 2021.10.06 |
[swexpert] 1230. 암호문3 (C++, 연결리스트) (0) | 2021.10.05 |
[SWEXPERT] 1232. 사칙연산 (이진트리, C++, D4) (0) | 2021.10.01 |
TAGS.