기타등등/알고리즘 기록

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

CodeJB 2021. 6. 21. 19:04

내 코드

#include <iostream>
//한번에 풀었음 채점해보기
int main() {
    int N, num, res = 0, cnt=0, max = -2147000000;
    
    scanf("%d",&N);
    
    for(int i = 1; i <= N; i++){
        scanf("%d",&num);
        if(num >= max){
            max = num;
            cnt++;
        }else {
            max = num;
            cnt = 1;
        }
        printf("cnt : %d \n",cnt);
        if(cnt > res) res = cnt;
    }
    
    printf("%d",res);
    return 0;
}
  • 채점은 안해보았으나 무리는 없어보인다.
  • 지금까지 배웠던 가장 기초적인 방법으로 해결해보았다.
  • 하지만 나열된 정수들이 있다고 했을 때, 서로 인접한 값들에 대한 비교를 해야할 때 응용할 수 있는 또 다른 솔루션이 있다.

효율적인 답

int main() {
    int n, i, pre, now, cnt = 0, max = -2147000000;
    
    scanf("%d", &n);
    scanf("%d", &pre);
    cnt = 1;
    max = 1;
    
    for(i = 2; i <= n; i++){
        scanf("%d", &now);
        if(now >= pre){
            cnt++;
            if(cnt > max) max = cnt;
        }
        else cnt = 1;
        pre = now;
    }
    
    printf("%d\n",max);
}
  • 나열된 정수에서 인접한 값에 대한 비교를 할 때,
  • 이전 값은 pre 변수에 넣고, 현재 비교할 값은 now에 넣어 둘을 비교한다.
  • 입력할 때, 약간 속임수(?) 야매(?)같은 방법으로 한줄에 값들을 쭉 입력하지만
  • 가장 첫번째 값은 pre에 들어가고 나머지는 반복하여 now에 들어간다
  • 야매 느낌이 좀 있지만 틀린 것은 아니기 때문에 나름 신박한 방법이라고 생각한다.
  • 이 또한 다른 문제에 응용이 가능하다고 생각한다.

'기타등등 > 알고리즘 기록' 카테고리의 다른 글

[C++] 선택정렬 - 3등의 성적은?  (0) 2021.07.26
[C++]Jolly Jumper  (0) 2021.06.21
[C++] 온도의 최대값  (0) 2021.06.19
[C++]카드게임  (0) 2021.06.19
[C++]가위바위보  (0) 2021.06.19