[백준] 2491번. 수열

연성·2020년 10월 19일
0

코딩테스트

목록 보기
88/261

[백준] 2491번. 수열

1. 문제

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 가 가장 긴 구간이 되므로 그 길이 4를 출력한다. 또 1 5 3 6 4 7 1 3 2 9 5 의 경우에는 연속해서 커지거나 작아지는 수열의 길이가 3 이상인 경우가 없으므로 2를 출력하여야 한다.

2. 입력

첫째 줄에는 수열의 길이 N이 주어지고, 둘째 줄에는 N개의 숫자가 빈칸을 사이에 두고 주어진다. N은 1 이상 100,000 이하의 정수이다.

3. 출력

첫째 줄에 가장 긴 길이를 출력한다.

4. 풀이

  • 연속해서 증가하는 구간의 최댓값을 구한다.
  • 연속해서 감소하는 구간의 최댓값을 구한다.
  • 둘 중 최댓값을 출력한다.

5. 처음 코드와 달라진 점

  • start, end를 이용해서 증가하다가 감소하기 시작하는 부분과 감소하다가 증가하는 부분의 길이를 구해서 최댓값을 구하려고 했다. 이것저것 넣어봤는데 됐는데 뭐가 틀린지 사실 잘 모르겠다.
  • 잘 모르겠어서 그냥 로직 자체를 단순하게 바꿔버렸다.

6. 코드 1(실패한 코드)

#include <iostream>
#include <algorithm>
using namespace std;

int arr[100000];

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int n;
	cin >> n;

	if (n == 1) {
		cout << !;
		return 0;
	}

	for (int i = 0; i < n; i++){
		cin >> arr[i];
	}
	int greaterCount = 0 ,lessCount = 0;
	int start = 0;
	bool isGreater = arr[0] <= arr[1] ? true : false;
	for (int i = 1; i < n-1; i++){	
		if (isGreater) {
			if (arr[i+1] < arr[i]) {
				isGreater = false;
				greaterCount = max(greaterCount, i - start + 1);
				start = i;
			}
		}
		else {
			if (arr[i+1] > arr[i]){
				isGreater = true;
				lessCount = max(lessCount, i - start + 1);
				start = i;
			}
		}
	}
	if (isGreater) greaterCount = max(greaterCount, n - start);
	else lessCount = max(lessCount, n - start);
	cout << max(greaterCount, lessCount);
	
}

7. 코드2(성공한 코드)

#include <iostream>
#include <algorithm>
using namespace std;

int arr[100000];

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int n;
	cin >> n;

	for (int i = 0; i < n; i++){
		cin >> arr[i];
	}

	int maxValue = 1;;
	int len = 1;
	for (int i = 1; i < n; i++) {
		if (arr[i] >= arr[i - 1]) len++;
		else len = 1;
		maxValue = max(maxValue, len);
	}

	len = 1;
	for (int i = 1; i < n; i++) {
		if (arr[i] <= arr[i - 1]) len++;
		else len = 1;
		maxValue = max(maxValue, len);
	}
	cout << maxValue;
}

0개의 댓글