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