알고리즘 모음(C++)

백준 2491 - 수열(C++) 본문

백준

백준 2491 - 수열(C++)

공대생의 잡다한 사전 2023. 7. 24. 17:58

문제 링크입니다. https://www.acmicpc.net/problem/2491

 

2491번: 수열

0에서부터 9까지의 숫자로 이루어진 N개의 숫자가 나열된 수열이 있다. 그 수열 안에서 연속해서 커지거나(같은 것 포함), 혹은 연속해서 작아지는(같은 것 포함) 수열 중 가장 길이가 긴 것을 찾

www.acmicpc.net

증가하는 수열 or 감소하는 수열을 둘 다 확인할 때, 가장 긴 길이를 확인하는 문제입니다.

 

2개의 수열을 확인해야하니 2차원 배열을 이용해서 풀었습니다.

 

처음 1번은 길이가 둘 다 1이니 1로 저장한 뒤,

다음 값부터 비교해주기 시작합니다.

1. 다음 값이 이전값보다 클 때 -> 증가하는 값을 1을 더한다, 감소하는 값을 1으로 바꾼다.

2. 다음 값이 이전값보다 작을 때 -> 증가하는 값을 1로 바꾼다, 감소하는 값을 1 더한다.

3. 같을 때 -> 2가지 경우다 1을 더한다.

 

 

자세한 것은 코드를 참고해주세요.

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cmath>

using namespace std;

int N;
int arr[100001];
int dx[100001][2]; // 0 -> up  1 -> down

void solve(){
    dx[1][0] = 1;
    dx[1][1] = 1;
    for(int i = 2; i <= N; i++){
        if(arr[i] > arr[i-1]){
            dx[i][0] = dx[i-1][0] + 1;
            dx[i][1] = 1;
        }
        else if(arr[i] < arr[i-1]){
            dx[i][1] = dx[i-1][1] + 1;
            dx[i][0] = 1;
        }
        else{
            dx[i][0] = dx[i-1][0] + 1;
            dx[i][1] = dx[i-1][1] + 1;
        }
    }
    int maxi = 0;
    for(int i = 1; i <= N; i++){
        maxi = max(maxi, dx[i][0]);
        maxi = max(maxi, dx[i][1]);
    }
    cout << maxi;
}

int main(){
    cin.tie(0);
    cout.tie(0);
    cin >> N;
    for(int i = 1; i <= N; i++) cin >> arr[i];
    solve();
    return 0;
}

 

 

자세한 것은 코드를 참고해주세요.

'백준' 카테고리의 다른 글

백준 9656 - 돌 게임2(C++)  (0) 2023.07.24
백준 9507 - Generations of Tribbles(C++)  (0) 2023.07.24
백준 14916 - 거스름돈(C++)  (0) 2023.07.24
백준 1495 - 기타리스트(C++)  (0) 2023.07.20
백준 1535 - 안녕(C++)  (0) 2023.07.19