https://www.acmicpc.net/problem/1912
정답률이 보여주듯이 완전 어려운 문제였다.
주어진 예제나 여러 가지 반례는 통과시킬 수 있게 코드를 짰지만 결국 틀렸다.
질문 게시판에 들어가서 힌트를 얻고서야 풀 수 있었는데
완전 심플하고 신박한 방법이라 복습겸 써본다.
1.sum을 0으로 초기화한다.
2.값 하나를 읽어 sum에 더한다.
3-1.값 하나를 더한 sum이 0보다 크면, sum과 maxSum 중 더 큰 것을 maxSum에 저장한다.
3-2.0보다 작으면 sum을 0으로 초기화한다.
4.수열이 끝날 때까지 2~3을 반복한 후 maxSum을 출력한다.
이렇게 하면 음수만 입력되는 경우를 제외한 모든 경우에 최대의 연속합을 구할 수 있다.
왜 그럴까?
sum은 계속 값을 더해가며 양수인 연속합을 갱신하는데 이 중 최대인 것을 maxSum이 저장하기 때문이다.
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 | #include<stdio.h> #define MAX(A,B) (A>B)?A:B #define MIN_NEGATIVE -1001 int main() { int N; int value; int cntNegative = 0; int maxNegative = MIN_NEGATIVE; int sum = 0; int maxSum = 0; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &value); if (value < 0) { maxNegative = MAX(value, maxNegative); cntNegative++; } sum += value; if (sum < 0) sum = 0; else maxSum = MAX(sum, maxSum); } if (cntNegative == N) printf("%d\n",maxNegative); else printf("%d\n",maxSum); system("pause"); return 0; } | cs |
'백준' 카테고리의 다른 글
3023)마술사 이민혁 (0) | 2019.02.04 |
---|---|
2033)반올림 (0) | 2019.02.04 |
2804)크로스워드 만들기 (0) | 2019.02.03 |
5032)탄산 음료 (0) | 2019.02.03 |
1026)보물 (0) | 2019.02.03 |