[CodeTree] Ch5.시뮬레이션 2 - 최장 연속 부분 수열

2026. 6. 1. 16:40·Algorithm

 

DP(Dynamic Programming)의 유형인 LCS(Longest Common Subsequence) 최장 공통 부분 수열과 다른 유형입니다.

최장 연속 부분 수열은 구현 시뮬레이션 문제입니다. 

 

개념 : 숫자가 동일한 연속 부분 수열

수열이 (2, 2, 7, 7, 7, 7, 5, 7, 7) 다음과 같이 주어졌을 때, 연속해서 나오는 같은 숫자를 한 묶음이라 보면, 

(2, 2), (7, 7, 7, 7), (5), (7, 7) 총 4개 묶음이 나옵니다.

 

새로운 묶음이 생겨나는 순간에 개수를 세줍니다.

새로운 묶음이 생겨나는 기준은 이웃한 이전 원소의 값과 현재의 값이 다를 때입니다. a[i] != a[i -1] 

 

|| OR 연산자

if( A || B)에서 A가 true이면 뒤의 B는 계산하지 않고 바로 {} 명령문들을 실행합니다. 따라서 A 에는 에러가 발생하지 않을 조건을 두어야합니다.

 

Warmup : 연속되는 수 2 

Warmup 연속되는 수 2
입출력 및 복잡도

https://www.codetree.ai/ko/trails/complete/curated-cards/intro-continuous-number2/description

 

연속되는 수 2 설명 | 코드트리

연속되는 수 2을 통해 문제 요구사항과 입력·출력 예시를 꼼꼼히 확인해 정확한 풀이 전략을 세워보세요.

www.codetree.ai

 

내풀이

풀이 1 : 배열 인덱스 1번째부터 탐색

놓친 부분 

  • 모든 숫자가 같을 때, 연속된 개수를 ret(최종값)에 업데이트를 하지 않음
  • 숫자의 개수가 최소 1개일 때 예외케이스 누락 -> 1일 때는 for반복문으로 이웃 비교를 하면 인덱스 에러가 발생함. 

해설코드와 다른점 

  • 해설 코드는 수열의 0번째부터 시작하여 if문에 i == 0일 때 a[i-1] 이전값을 참조하는 것을 막음. (인덱스 에러 방지) 

 

 

풀이 2 : 배열 인덱스 0번째부터 탐색

#include<bits/stdc++.h>
using namespace std;
int n, ret = -1e9, arr[1004], cnt=1;
int main() {
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    for(int i = 0; i < n; i++) {
        if(i == 0 || arr[i] != arr[i - 1]) {
            ret = max(ret, cnt); cnt = 0;
        }
        cnt++; // 연속으로 같은 숫자를 더한다 
    }
    // 모두 다 같을 때 처리하는 방법 
    ret = max(ret, cnt);
    cout << ret << '\n';
    return 0;
}

 

해설코드 

#include <iostream>
#include <algorithm>

#define MAX_N 1000

using namespace std;

int n;
int arr[MAX_N];

int main() {
    // 입력
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> arr[i];
    
    // 연속하여 동일한 숫자가 나오는 횟수를 구해보며,
    // 그 중 최댓값을 갱신합니다.
    int ans = 0, cnt = 0;
    for(int i = 0; i < n; i++) {
		// Case 1
        if(i >= 1 && arr[i] == arr[i - 1])
            cnt++;
		// Case 2
        else
            cnt = 1;
        
        ans = max(ans, cnt);
    }
    
    cout << ans;
    return 0;
}

 

 

 

Challenge : 연속되는 수 3

Challenge 연속되는 수3
입출력 및 복잡도

 

https://www.codetree.ai/ko/trails/complete/curated-cards/challenge-continuous-number3/description

 

연속되는 수 3 설명 | 코드트리

연속되는 수 3을 통해 문제 요구사항과 입력·출력 예시를 꼼꼼히 확인해 정확한 풀이 전략을 세워보세요.

www.codetree.ai

 

`증가하는 연속 부분 수열`

연속하는 부분 수열 중 원소의 숫자가 계속 증가하는 수열

 

내풀이

앞에서 배운 틀을 유지하되, "원소의 숫자가 증가하는 수열"만 적용해 코드를 작성했더니 해설코드와 똑같이 나왔습니다.

개념설명과 쌍을 이루는 기본문제와 여러 Challenge문제가 변형이 잘 되는 것 같습니다.

#include<bits/stdc++.h>
using namespace std;
int n, arr[1004], cnt, ret = -1e9;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >>  n; 
    for(int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    for(int i = 0; i < n; i++) {
        if(i >= 1 && arr[i] > arr[i-1]) cnt++;
        else cnt = 1;
        ret = max(ret, cnt);
    }
    cout << ret;
    return 0;
}

 

Challenge : 연속되는 수 4

Challenge : 연속되는 수 4
입출력 및 복잡도

 

내풀이

#include<bits/stdc++.h>
using namespace std;
int n, arr[1004], cnt, ret = -1e9;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >>  n; 
    for(int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    for(int i = 0; i < n; i++) {
        if(i >= 1 && arr[i] > arr[i-1]) cnt++;
        else cnt = 1;
        ret = max(ret, cnt);
    }
    cout << ret;
    return 0;
}

해설코드 

#include <iostream>
#include <algorithm>

#define MAX_N 1000

using namespace std;

int n;
int arr[MAX_N];

int main() {
    // 입력
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> arr[i];
    
    // 연속하여 동일한 숫자가 나오는 횟수를 구해보며,
    // 그 중 최댓값을 갱신합니다.
    int ans = 0, cnt = 0;
    for(int i = 0; i < n; i++) {
		// Case 1
        if(i >= 1 && arr[i] > arr[i - 1])
            cnt++;
		// Case 2
        else
            cnt = 1;
        
        ans = max(ans, cnt);
    }
    
    cout << ans;
    return 0;
}

 

Test : T를 초과하는 연속 부분 수열

 

Test: T를 초과하는 연속 부분 수열
입출력 및 복잡도

내풀이

풀이시간 1시간

 

접근 방법

현재 탐색하는 원소가 T보다 큰 경우와 T보다 작거나 같은 경우로 나눠 연속 부분 수열을 구한다

 

막힌 지점 

  • 이전 문제들처럼 이전 요소간의 비교가 필요하다고 생각해, arr[i] > t && arr[i-1] > t 일 때 cnt++ 하는 코드 작성. 이는 이전 요소가 arr[i] 현재 탐색하는 시점일 때 cnt++한 것을 중복으로 세어 정답보다 많은 값이 나오게 됨 
  • 현재 탐색하는 원소가 t 보다 큰 것을 카운팅하는 것이 목적이고, 이전 요소가 t보다 큰 것은 확인할 필요가 없음. 현재 탐색하는 원소가 t보다 작거나 같을 때 카운팅을 초기화 하면 됨

놓친 지점 

  • 테스트 케이스 `4 1 3 3 3 3` 일 때, 이전 문제처럼 첫 카운트 변수 (cnt )를 1로 초기화 하면 안됨.
    • 이전에는 조건이 숫자이기만 하면 1개는 카운팅 되었고, 이 문제는 T보다 클 때만, 연속 부분 수열이 되기 때문
#include <bits/stdc++.h>
using namespace std;
int n, t, arr[1004], cnt , ret= -1e9;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >> n >> t; 
    for(int i = 0; i< n; i++) cin >> arr[i];

    for(int i = 0; i < n; i++) {
        if(arr[i] > t) {
            cnt++;
        }
        else cnt = 0;
        ret = max(ret, cnt);
    }

    cout << ret << '\n';
    return 0;
}

 

해설코드

#include <iostream>
#include <algorithm>

#define MAX_N 1000

using namespace std;

int n, t;
int arr[MAX_N];

int main() {
    // 입력
    cin >> n >> t;
    for(int i = 0; i < n; i++)
        cin >> arr[i];
    
    // 연속하여 t보다 큰 숫자가 나오는 횟수를 구해보며,
    // 그 중 최댓값을 갱신합니다.
    int ans = 0, cnt = 0;
    for(int i = 0; i < n; i++) {
		// Case 1
        if(arr[i] > t)
            cnt++;
		// Case 2
        else
            cnt = 0;
        
        ans = max(ans, cnt);
    }
    
    cout << ans;
    return 0;
}

코드트리 청약 챌린지 진행중입니다!

같이 코테 꾸준히 공부해봅시다

https://www.codetree.ai/ko/no-free-lunch-2026/?ref=T38PMZ

 

3년 만에 돌아온, 코드트리 청약 통장 챌린지 | 코드트리

매주 학습 납입하고 7주 만기 채우면 코드트리 8월까지 무료. 매주 추첨권을 모아 맥북·에어팟·애플워치 응모까지. 신청 인원에 따라 조기마감될 수 있어요.

www.codetree.ai

 

 

'Algorithm' 카테고리의 다른 글

[CodeTree] 5회차: 북마크로 틀린 문제, 삽질한 문제 복습하는 습관 만들기  (0) 2026.06.07
[CodeTree] Ch5.시뮬레이션 2 - 배열 기록  (0) 2026.06.05
[CodeTree] 4회차: 코테 꾸준히 하고자 하는 습관을 지켜주는 환경 (feat. 학습 리마인더 알림톡)  (0) 2026.06.01
[CodeTree] Ch4. 시뮬레이션1 - 사각형 칠하기  (0) 2026.05.26
[CodeTree] 3회차: Trail2.시뮬레이션1 약점 학습 후기  (0) 2026.05.22
'Algorithm' 카테고리의 다른 글
  • [CodeTree] 5회차: 북마크로 틀린 문제, 삽질한 문제 복습하는 습관 만들기
  • [CodeTree] Ch5.시뮬레이션 2 - 배열 기록
  • [CodeTree] 4회차: 코테 꾸준히 하고자 하는 습관을 지켜주는 환경 (feat. 학습 리마인더 알림톡)
  • [CodeTree] Ch4. 시뮬레이션1 - 사각형 칠하기
geologs
geologs
geologs 님의 블로그 입니다.
  • geologs
    geolog
    geologs
  • 전체
    오늘
    어제
    • 분류 전체보기 (20) N
      • Artificial Intelligence (1)
        • Vibe Coding (0)
        • RAG (0)
      • Algorithm (10) N
      • SpringBoot (0)
      • Network (0)
      • Architecture (0)
      • Design Pattern (1)
      • OpenSource Contribution (5)
      • 취준 (0)
      • 트러블슈팅 (2)
      • 자격증 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코테공부
    시뮬레이션1
    opensource contribution
    claude code 설치
    TemplateInputException
    코딩테스트
    SAA 단기 합격
    gradle wrapper
    setting.gradle
    spring boot
    Dispatcher Servelt
    오픈소스 빌드 환경 구성
    코드트리
    Template Resolver
    open source contribution
    코테독학
    c++
    백준2828번
    Spring boot 로컬 빌드 환경 구성
    AWS SAA 합격후기
    사과담기게임
    Edit On Mode
    ParseException
    개발자루틴
    HandleMethod
    사각형칠하기
    코드트리 #코딩테스트 #코테공부 #코테준비 #알고리즘공부 #갭체크
    Plan Mode
    mavenCentral()
    preHandle
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
geologs
[CodeTree] Ch5.시뮬레이션 2 - 최장 연속 부분 수열
상단으로

티스토리툴바