https://www.acmicpc.net/problem/2491
2491번: 수열
0에서부터 9까지의 숫자로 이루어진 N개의 숫자가 나열된 수열이 있다. 그 수열 안에서 연속해서 커지거나(같은 것 포함), 혹은 연속해서 작아지는(같은 것 포함) 수열 중 가장 길이가 긴 것을 찾아내어 그 길이를 출력하는 프로그램을 작성하라. 예를 들어 수열 1 2 2 4 4 5 7 7 2 의 경우에는 1≤2≤2≤4≤4≤5≤7≤7 이 가장 긴 구간이 되므로 그 길이 8을 출력한다. 수열 4 1 3 3 2 2 9 2 3 의 경우에는 3≥3≥2≥2 가 가
www.acmicpc.net
연속되어 증가하는 가장 긴 수열을 구하거나 연속되어 감소하는 가장 긴 수열의 길이를 구하는 문제이다. 다이나믹 프로그래밍을 이용하여 푼다.
#include <iostream>
#include <algorithm>
#include <vector>
#define MAX 100001
using namespace std;
int main() {
int n; //수열의 길이
int num; //수열의 각 원소
int big = 0, small = 0; //현재까지 가장 큰 숫자, 현재까지 가장 작은 숫자
int d1[MAX] = { 0, }; //x번 숫자 일 때 증가 수열의 길이
int d2[MAX] = { 0, }; //x번 숫자 일 때 감소 수열의 길이
int ans = -1; //가장 긴 증가 수열이거나 가장 긴 감소수열의 길이
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> num;
if (i == 1) { //첫번째 원소이면
//각 수열의 길이를 1로 설정
d1[1] = 1;
d2[1] = 1;
//각각의 가장 큰 숫자와 가장 작은 숫자를 처음 숫자로 설정
big = num;
small = num;
}
else { //그 외의 경우
if (big <= num) { //현재 입력한 숫자가 가장 큰 숫자보다 크면
big = num; //현재 숫자를 가장 큰 숫자로 교체하고
d1[i] = d1[i - 1] + 1; //직전 수열에서 +1을 하여 현재 길이를 증가시킨다.
}
else { //그 외의 경우
big = num; //현재 숫자를 가장 큰 숫자로 교체하고
d1[i] = 1; //현재 길이를 1로 설정
}
if (small >= num) { //현재 입력한 숫자가 가장 작은 숫자보다 작으면
small = num; //현재 숫자를 가장 작은 숫자로 교체하고
d2[i] = d2[i - 1] + 1; //직전 수열에서 +1 하여 현재 길이를 증가시킨다.
}
else { //그 외의 경우
small = num; //현재 숫자를 가장 작은 숫자로 교체하고
d2[i] = 1; //현재 길이를 1로 설정
}
}
//현재 위치에서 가장 긴 숫자를 구한다.
ans = max(ans, d1[i]);
ans = max(ans, d2[i]);
}
cout << ans;
}
'백준' 카테고리의 다른 글
백준1166 - 선물 (0) | 2020.03.31 |
---|---|
백준12101 - 1, 2, 3 더하기 2 (0) | 2020.03.30 |
백준1890 - 점프 (0) | 2020.03.27 |
백준1041 - 주사위 (0) | 2020.03.26 |
백준14889 - 스타트와 링크 (0) | 2020.03.22 |