본문 바로가기
OLD_알고리즘/Baekjoon

백준] 1912 : 연속합

by 달승 2020. 10. 5.

BOJ에서 다음 문제들을 쭉 순서대로 풀어본다.  boj.kr/문제번호 <= 형태로 검색하면 된다.

DP - 1463, 11726, 11727, 9095, 10844, 11057, 2193, 9465, 2156, 11053, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 11052

 

 

1시간 넘어가면 풀던 짓을 그만두고 반드시 AC받은 코드 찾아보기 (설명이 꼭 달려있는 코드를 읽자)

그리고 푼 다음에는 반드시 다른 사람의 코드를 봐야 한다.

특히 자신만의 가상의 스승을 잡고 그 분의 코드를 보는 것도 좋은 방법이라 생각한다.

너무 갓갓들은 이상한 방식으로도 짜는 경우도 있기 때문에 적당한 사람을 선택해야 한다.

 

 

알고리즘 문제풀이(PS) 시작하기

plzrun.tistory.com

 

내가 애용하는 IDE 사이트

(IDE 자동 완성이 불가능하기 때문에 사용하는 중)

 

Ideone.com

ideone.com


 

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

 

 

 

접근 방법

 

 

 

더보기

 첫 번째 코드

: if(dp[i - 1] + arr[i] > dp[i]) 이렇게 비교해놓고, 엥 왜 틀렸지? 이러고 있었다..ㅎ

#include <iostream>
using namespace std;

int arr[100001], dp[100001];

int main() {
	
	int n, max;
	
	cin >> n;
	
	for(int i = 0; i < n; i++){
		cin >> arr[i];
	}
	
	dp[0] = max = arr[0];
	
	for(int i = 1; i <= n; i++){
		
		if(dp[i - 1] + arr[i] > dp[i]){
			dp[i] = dp[i - 1] + arr[i];
		}else{
			dp[i] = arr[i];
		}
	}
	
	for(int i = 0; i < n; i++){
		if(max < dp[i]){
			max = dp[i];
		}
		//cout << dp[i] << " ";
	}
	//cout << endl;
	cout << max;
	
	return 0;
}

 

 

 

두 번째 코드 :  

주석부분을 제외하고 다시 제출 후, 정답.

#include <iostream>
using namespace std;

int arr[100001], dp[100001];

int main() {
	
	int n, max;
	
	cin >> n;
	
	//for(int i = 0; i < n; i++){
	for(int i = 1; i <= n; i++){

		cin >> arr[i];
	}
	
	max = arr[1];

    //for(int i = 1; i <= n; i++){
	for(int i = 1; i <= n; i++){
		
		if(dp[i - 1] + arr[i] > arr[i]){
			dp[i] = dp[i - 1] + arr[i];
		}else{
			dp[i] = arr[i];
		}
	}
	
	for(int i = 1; i <= n; i++){
		if(max < dp[i]){
			max = dp[i];
		}
	}
	cout << max;
	
	return 0;
}

 

 

 

정답 코드

#include <iostream>
using namespace std;

int arr[100001], dp[100001];

int main() {
	
	int n, max;
	
	cin >> n;
	
	for(int i = 1; i <= n; i++){

		cin >> arr[i];
	}
	
	max = arr[1];

	for(int i = 1; i <= n; i++){
		
		if(dp[i - 1] + arr[i] > arr[i]){
			dp[i] = dp[i - 1] + arr[i];
		}else{
			dp[i] = arr[i];
		}
	}
	
	for(int i = 1; i <= n; i++){
		if(max < dp[i]){
			max = dp[i];
		}
	}
	cout << max;
	
	return 0;
}

 

 

 

 

참고한 블로그

 

댓글