-
백준(BOJ) 1806번 부분합알고리즘 풀이/백준(Boj) 2020. 4. 15. 03:07
문제 : https://www.acmicpc.net/problem/1806
1806번: 부분합
문제 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. 출력 첫째 줄에 구하고자 하는 최소의 길
www.acmicpc.net
풀이 :
완전 탐색을 이용 시 n이 크기에 시간 내에 처리하지 못하고 투 포인터를 이용해서 처리해보자
lo와 hi는 인덱스를 가리키고 0으로 초기화한 후 조건이 만족할 때마다 값을 경신해준다.
lo와 hi이 최대로 수행되더라도 2O(n) 이기 때문에 시간 내에 충분히 가능하다.
코드 ( C++ )
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <iostream> #include <vector> #include <algorithm> using namespace std; int n, s; const int INF = 987654321; int main() { cin >> n >> s; vector<int> A(n); for (auto& i : A) cin >> i; int sum = 0; int lo = 0, hi = 0; int ans = INF; while (lo < n) { if (sum < s && hi < n) sum += A[hi++]; else sum -= A[lo++]; if (sum >= s) ans = min(ans, hi - lo); } if (ans == INF) cout << 0 << "\n"; else cout << ans << "\n"; return 0; } '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 17085번 십자가 2개 놓기 (수정) (0) 2020.04.18 백준(BOJ) 15831번 준표의 조약돌 (0) 2020.04.15 백준(BOJ) 1022번 소용돌이 예쁘게 출력하기 (0) 2020.04.14 백준(BOJ) 16638번 괄호 추가하기 2 (0) 2020.04.09 백준(BOJ) 1726번 로봇 (0) 2020.04.08