본문 바로가기

문제풀이/C++

[C++] 연속 부분 증가수열

728x90

[문제]

수열의 길이를 입력받은 후 해당 수열의 숫자를 입력받아 연속적으로 증가하는 부분 수열의 최대 길이를 구하여 출력하는 프로그램을 작성하라.

 

[입력 예제]

9
5 7 3 3 12 12 13 10 11

 

[출력 예제]

5

 

길이가 9인 수열을 위 입력 예제와 같이 입력받았다.

해당 수열에서는 [3, 3, 12, 12, 13] 구간이 연속적으로 증가하는 최대 길이이기에 5를 출력하였다.


[코드]

#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {
    
    int n, max=0, res=1; //수열의 길이는 자기자신도 포함이니 res변수를 1로 초기화 시켜준다.
    
    /*1*/cin >> n;
    
    int a[n];
    
    /*2*/for(int i=0; i<n; i++) cin >> a[i];
	
    /*3*/for(int i=0; i<=n-1; i++){
        if(a[i] <= a[i+1]) res++;
        /*4*/else {
            if(max < res) max = res;
            res = 1;
        }
    }
    /*5*/cout << max;
	
    return 0;
}

 

[설명]

  1. 수열의 길이를 입력받는다 (n)
  2. 배열을 만들어 배열 안에 수열의 숫자들을 입력받는다. (a[n])
  3. for문은 배열(수열)의 처음 부터 배열의 끝 -1 지점까지 반복하며 만약 앞의 값(a[i])보다 뒤의 값(a[i+1])이 크거나 같으면 res변수를 1 높여준다.
    [+] 배열의 끝 -1 까지 반복하는 이유는 앞의 값과 뒤의값을 비교하기에 배열의 끝까지 비교 할 경우 배열의 길이를 넘는 값과 비교하게 되어 잘못된 결과가 나오기 때문이다.
  4. 그렇지 않은 경우 만약 max값보다 res값이 큰 경우에는 max에 res값을 넣어주고 res를 다시 1로 초기화 시켜준다.
  5. max값을 출력한다.

[실행결과]

 

[+] 21.01.11

코드 오류가 있다..

for문을 돌 때 n을 10을 받은 경우 i는 0부터 9까지 반복하는데

a[9]번째와 a[10]번째를 비교하게 되어 a[10]번째는 배열 크기를 벗어나기에 오류가 생길 것 같다..

i가 8까지 돌아 a[8]번째와 a[9]번째를 비교하는 것을 마지막으로 for문이 끝이나야한다.

그렇게 되면 a배열에 1부터 10까지 순차적으로 들어가는 숫자라 하였을 때 else문을 한번도 방문하지 않아

max에 res값이 넣어지지 않을 수 있다.

for문을 빠져나와서도 비교 구문을 통해 max에 res를 넣어주는 코드로 수정해야한다..

728x90
반응형

'문제풀이 > C++' 카테고리의 다른 글

[C++] 석차 구하기  (0) 2021.01.15
[C++] Jolly Jumpers  (0) 2021.01.11
[C++] 온도의 최대값  (0) 2021.01.10
[C++] 카드게임  (0) 2021.01.08
[C++] 가위 바위 보  (0) 2021.01.06