| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 이미지 업로드
- 스프링부트
- spring websocket nginx 설정
- S3
- wss 연결 실패
- 백준 10815 # 백준 Java
- OpenAI API
- session
- 관점 지향 프로그래밍
- ec2 nginx websocket reverse proxy
- jwt
- Flask
- 소셜 로그인
- AWS
- @Valid
- springboot
- validation
- spring boot
- logout
- fastapi
- 구글 로그인
- 도메인 주도 개발
- oauth2.0
- 예외 처리
- 자바 orm
- 개발 프로젝트
- CustomException
- GoormIDE
- presigned url
- 패러다임 불일치
Archives
- Today
- Total
개발세발은 안되요
[C++] 백준 1806 : 부분합 본문
문제
https://www.acmicpc.net/problem/1806
풀이
입력과 동시에 누적합을 구한다.
n_sum[i] = n_sum[i-1]+n;
투포인터를 이용하여 구간합이 S 이상인 구간을 구한다.
- 구간합이 M 이상인 경우, start++
- 구간합이 M 이상이면서, 해당 구간의 길이가 최솟값인 경우 구간 길이 최솟값 갱신
- 구간합이 M 미만인 경우, end++
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int n, s, ans = 200001;
int arr[100001];
int n_sum[100001];
int main() {
cin >> n >> s;
for(int i=1; i<=n; i++){
cin >> arr[i];
n_sum[i] = n_sum[i-1]+arr[i]; // 구간합 계산
}
// 투포인터
int start = 0, end = 1;
while(end<=n){
int sum = n_sum[end] - n_sum[start];
if(sum >= s){
start++; // 구간합이 S 이상이면 start 증가
if(end-start+1 < ans){
ans = end-start+1; // 구간 길이 최솟값 갱신
}
}
else{
end++; // 구간합이 S 미만이면 end 증가
}
}
if(ans == 200001){
cout << 0 << "\n"; // S 이상의 구간합을 찾을 수 없는 경우 0 출력
return 0;
}
cout << ans << "\n";
return 0;
}'알고리즘 > 백준' 카테고리의 다른 글
| [C++] 백준 2805 : 나무 자르기 (1) | 2025.08.18 |
|---|---|
| [C++] 백준 14502 : 연구소 (1) | 2025.08.17 |
| [C++] 백준 2230 : 수 고르기 (1) | 2025.08.15 |
| [C++] 백준 7562 : 나이트 (1) | 2025.08.15 |
| [C++] 백준 2294 : 동전 2 (2) | 2025.08.10 |