본문 바로가기

백준

백준2491 - 수열

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