1806번 - 부분합
이 문제는 쓸모없는 계산을 줄여서 시간을 줄이는 완전탐색을 연습하는 문제 인 것 같다.
그냥 2중 for문으로 break 문을 넣어줘도 AC를 받긴했지만, 아래 방법으로 푸니까 속도가 10배이상 줄어들었다.
아무래도 2중 for문으로 풀 때는 sum값을 계속해서 재계산 했는데, 이 방법은 sum 값을 계속 유지하기 떄문에 그런 것 같다.
<정답 코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include<iostream> #include<vector> using namespace std; const int INF = 100001; int main() { int n, m, ans = INF; scanf("%d%d", &n,&m); vector<int> v(n); for (int i = 0; i < n; i++) { scanf("%d", &v[i]); } int left = 0, right = 0, sum = 0, cnt = 0; while (left <= right && right < n) { if (sum < m) { sum += v[right++]; cnt++; } else if (sum >= m) { if (cnt < ans) { ans = cnt; } sum -= v[left++]; cnt--; } } if (ans == INF) { ans = 0; } printf("%d\n", ans); return 0; } | cs |
<정답 코드 2중 for문>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include<iostream> #include<vector> using namespace std; const int INF = 100001; int main() { int n, m, ans = INF; scanf("%d%d", &n,&m); vector<int> v(n); for (int i = 0; i < n; i++) { scanf("%d", &v[i]); } for (int i = 0; i < n; i++) { int sum = 0; int cnt = 0; for (int j = i; j < n; j++) { sum += v[j]; cnt++; if (sum >= m) { ans = cnt < ans ? cnt : ans; break; } } } if (ans == INF) { ans = 0; } printf("%d\n", ans); return 0; } | cs |
반응형