| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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
- jwt
- S3
- 이미지 업로드
- fastapi
- 패러다임 불일치
- 소셜 로그인
- springboot
- 도메인 주도 개발
- wss 연결 실패
- 관점 지향 프로그래밍
- spring boot
- 예외 처리
- 백준 10815 # 백준 Java
- 개발 프로젝트
- ec2 nginx websocket reverse proxy
- 자바 orm
- @Valid
- presigned url
- logout
- spring websocket nginx 설정
- AWS
- session
- CustomException
- oauth2.0
- 스프링부트
- 구글 로그인
- Flask
- validation
- GoormIDE
- OpenAI API
Archives
- Today
- Total
개발세발은 안되요
[C++] BJO 1024 : 수열의 합 본문
문제
https://www.acmicpc.net/problem/1024
풀이
입력받은 n/2+1 부터 수를 1씩 줄여가며 더해가고, n을 만들 수 있는지를 검사한다.
이때 가장 오래전에 더한 수를 end에 저장하고, 가장 최근에 더한 수를 start에 저장한다.
만약 새로 계산한 합이 n을 넘었다면, end를 합에서 빼준 후 end를 줄여준다.
자세한 구현은 코드에서 확인 가능하다.
코드
#include <iostream>
using namespace std;
long n, l;
long ans = 1000;
int main()
{
cin >> n >> l;
long end = n/2 + 1;
long start = end-1;
long cnt = end;
while(end > start && end >= 0 && start >=0){
cnt+= start;
if(cnt == n && end-start+1 >= l){
ans = end - start + 1;
break;
}
if(cnt > n){
cnt-= end;
end--;
}
start--;
}
if(ans == 1000 || ans >100) cout << -1;
else{
for(int i = start; i<=end; i++ )cout << i << " ";
}
cout << "\n";
return 0;
}
메모
완전탐색이 아니어도 풀리기는 풀린다.
그리고 좀 더 수학적으로 접근하는 방법이 있기는 한데, 그걸 떠올리기 싫었고 더 복잡해보여서 이렇게 풀었다.
아 대신 내 코드의 경우 처음에 95%에서 틀리는 문제가 반복되었는데 이는 처음 start와 end를 초기화하는 과정에서 고려하지 못한 케이스가 있었다.
지금은 end를 n/2+1로 설정하지만 이전에는 1을 더하지 않아서 7+8=15와 같은 경우를 고려하지 못했다.
반례로 참고해보아도 좋을 듯하다.
'알고리즘 > 백준' 카테고리의 다른 글
| [C++] BJO 1058 : 친구 (0) | 2026.01.14 |
|---|---|
| [C++] BJO 1101 : 카드 정리1 (0) | 2026.01.13 |
| [C++] BJO 17142 : 연구소 3 (0) | 2025.12.01 |
| [C++]BJO 14891 : 톱니바퀴 (0) | 2025.11.28 |
| [C++] BJO 14888 : 연산자 끼워넣기 (0) | 2025.11.28 |