일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java
- 구글
- 백준위
- 싸피셜
- python
- IT 동향
- html
- 인앱결제
- 프로그래머스
- 네트워크 관리사
- it 이슈
- 신문스크랩
- 싸피
- SSAFYcial
- 신문 스크랩
- 코딩테스트
- IT 트렌드
- KT
- SSAFY 7기
- 네트워크 관리사 2급
- java 객체지향 프로그래밍
- 우테코
- 카카오
- it 뉴스
- 코딩테스트 연습
- 백준
- SSAFY
- 코테
- 리얼클래스
- 네트워크 관리사 2급 실기
- Today
- Total
개발자일걸요..?
1912번 연속합 본문
문제링크 : www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
<알고리즘>
1) 입력받은 수를 넣는 배열 number과는 별도의 숫자들의 합을 넣을 배열 dq를 생성
2) for문을 통해 dq의 i번째 값으로 number[i]와 dq[i-1]+number[i]중 더 큰값을 삽입
여기서, dq[i-1]과 number[i]를 더하는 값은 이제까지 제일 큰 값에 지금 고려하는 값을 넣은 경우이고,
그냥 number[i]는 이제까지의 값은 버리고(지금 값을 더 작게 만드는 값이기에) 새값을 고려하는 경우이다.
3) dq를 만듦과 함께 가장 큰 값을 찾는 max함수 이용하기
dq를 다 만든 후에 해도 되지만, 반복문을 줄이기 위해서 함께 하는 것이 좋다.
<표로 보는 풀이>
1) number과 dq 생성(dq와 max의 첫 값은 number[0]값으로 입력)
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | |||||||||
max | 10 |
2) dq[1] = number[1]과 dq[0]+number[1] 중 큰 값, max = dq[0]과 dq[1]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | ||||||||
max | 10 | 10 |
3) dq[2] = number[2]과 dq[1]+number[2] 중 큰 값, max = dq[1]과 dq[2]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | |||||||
max | 10 | 10 | 10 |
4) dq[3] = number[3]과 dq[2]+number[3] 중 큰 값, max = dq[2]과 dq[3]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | 10 | ||||||
max | 10 | 10 | 10 | 10 |
5) dq[4] = number[4]과 dq[3]+number[4] 중 큰 값, max = dq[3]과 dq[4]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | 10 | 15 | |||||
max | 10 | 10 | 10 | 10 | 15 |
6) dq[5] = number[5]과 dq[4]+number[5] 중 큰 값, max = dq[4]과 dq[5]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | 10 | 15 | 21 | ||||
max | 10 | 10 | 10 | 10 | 15 | 21 |
7) dq[6] = number[6]과 dq[5]+number[6] 중 큰 값, max = dq[5]과 dq[6]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | 10 | 15 | 21 | -14 | |||
max | 10 | 10 | 10 | 10 | 15 | 21 | 21 |
8) dq[7] = number[7]과 dq[6]+number[7] 중 큰 값, max = dq[6]과 dq[7]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | 10 | 15 | 21 | -14 | 12 | ||
max | 10 | 10 | 10 | 10 | 15 | 21 | 21 | 21 |
9) dq[8] = number[8]과 dq[7]+number[8] 중 큰 값, max = dq[7]과 dq[8]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | 10 | 15 | 21 | -14 | 12 | 33 | |
max | 10 | 10 | 10 | 10 | 15 | 21 | 21 | 21 | 33 |
10) dq[9] = number[9]과 dq[8]+number[9] 중 큰 값, max = dq[8]과 dq[9]중 큰 값
number | 10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
dq | 10 | 6 | 9 | 10 | 15 | 21 | -14 | 12 | 33 | 32 |
max | 10 | 10 | 10 | 10 | 15 | 21 | 21 | 21 | 33 | 33 |
메모리 : 2676KB 시간 : 28ms
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N = 0;
cin >> N;
int number[100001];
int dq[100001];
int a = 0;
for (int i = 0; i < N; i++) {
cin >> a;
number[i] = a;
}
dq[0] = number[0];
int temp = dq[0];
for (int i = 1; i < N; i++) {
dq[i] = max(number[i], number[i] + dq[i - 1]);
temp = max(temp, dq[i]);
}
cout << temp;
}
+) 실패한 코드
why? 음수로만 이루어진 수열, 혹은 시작이 음수인 수열의 경우 0이 자꾸 삽입됨.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int N = 0;
cin >> N;
vector<int> number;
int a = 0;
for (int i = 0; i < N; i++) {
cin >> a;
number.push_back(a);
}
vector<int> firstadd;
vector<int> addMax;
int sum = 0;
for (int i = 0; i < N; i++) {
if (number[i] >= 0) sum += number[i];
else {
firstadd.push_back(sum);
addMax.push_back(sum);
firstadd.push_back(number[i]);
sum = 0;
}
}
int start = 0;
int index = 0;
if (firstadd[0] >= 0 || firstadd.size() == 1) { start = firstadd[0]; }
else {
start = firstadd[1];
index = 1;
}
while(index<firstadd.size()){
if (index + 2 < firstadd.size()) {
if (abs(firstadd[index + 1]) <= abs(firstadd[index + 2])) {
start += (firstadd[index + 1] + firstadd[index + 2]);
index += 2;
}
else {
addMax.push_back(start);
start = firstadd[index + 2];
index += 2;
}
}
else {
break;
}
}
int maximum = -1001;
for (unsigned int i = 0; i < addMax.size(); i++) {
maximum = max(maximum, addMax[i]);
}
cout << maximum << "\n";
return 0;
}
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
2156번 포도주 시식 (0) | 2021.03.24 |
---|---|
2579번 계단오르기 (0) | 2021.03.24 |
12865번 평범한 배낭 (0) | 2021.03.20 |
9251번 LCS (0) | 2021.03.19 |
2565번 전깃줄 (0) | 2021.03.18 |