본문 바로가기
백준 문제풀이

BOJ/1912

by alscks 2024. 1. 28.
연속합

**아래 코드는 정답이 아닙니다**
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <algorithm>


int main() {

	int x;
	scanf("%d", &x);
	
	int arr[100009] = {0,};

	for (int i = 1; i <= x; i++) {
		scanf("%d", &arr[i]);
	}
	int real_big = -100000000;
	for (int i = 1; i <= x; i++) { // 합의 개수
		int mem = -100000000;
		int sum = 0;
		for (int j = i; j <= x; j++) {
			sum += arr[j];
			if (sum > mem) {
				mem = sum;
			}
		}
		if (mem > real_big) {
			real_big = mem;
		}
	}

	printf("%d", real_big);
	
	
	return 0;
}​

단순히 모든 연속합을 구하여 가장 큰 것을 고르는 방법으로는 시간이 오래 소요되어(O(n^2)) 정답으로 통과되지 않는다.

 

카데인 알고리즘

전체 배열에서 부분합을 구하는 방법.

  • 새 배열을 만들고 처음 요소부터 수열의 합을 구해 입력한다.
  • (현재 수 + 이전 요소들까지의 합) < 현재 수 이면 합을 초기화하고 다시 수열의 합을 구해 배열에 저장.
  • 만들어진 배열 중 가장 큰 값이 부분합의 최대이다.
  •  
**아래 코드가 정답**
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <algorithm>


int main() {

	//카데인 알고리즘//

	int x;
	scanf("%d", &x);
	
	int arr[100009] = { 0, };

	for (int i = 1; i <= x; i++) {
		scanf("%d", &arr[i]);
	}

	int ss[100009] = { 0, };//계산되는 수열을 저장할 배열
	
	ss[1] = arr[1];
	int sum = arr[1];
	
	for (int i = 2; i <= x; i++) {
		if (ss[i - 1] + arr[i] < arr[i]) { //이번 숫자와 이전 숫자들끼리의 합이 이번 숫자보다 작으면 초기화
			sum = 0;
		}
		sum += arr[i]; //처음/초기화 이후부터 현재 수열까지의 합
		ss[i] = sum; // sum을 ss배열에 추가
	}

	/* ss출력
	for (int i = 1; i <= x; i++) { //ss배열 중 가장 큰 값이 답.
		printf("%d", ss[i]);
	}
	*/

	int big = -100000000;
	for (int i = 1; i <= x; i++) { //ss배열 중 가장 큰 값이 답.
		if (ss[i] > big) {
			big = ss[i];
		}
	}
	
	printf("%d\n", big);
	
	return 0;
}​

'백준 문제풀이' 카테고리의 다른 글

BOJ/2583  (1) 2024.01.28
BOJ/12852  (0) 2024.01.28
BOJ/11650  (2) 2024.01.27
BOJ/8393  (0) 2024.01.25
BOJ/1182  (0) 2024.01.25