본문 바로가기
알고리즘

중복없는구간

by Chars4785 2019. 5. 10.

문제


n개의 숫자가 주어지고, 이 중에서 r개의 연속된 숫자를 선택했을 때, 이 연속 부분 내에는 숫자가 중복되지 않기를 원한다. 예를 들어, 다음과 같이 10개의 숫자에서 3개의 연속된 숫자를 선택할 수 있다.

이렇게 선택을 하면, 선택된 숫자들 사이에서는 중복이 존재하지 않는다. r의 최댓값을 구하는 프로그램을 작성하시오. 위의 경우, (4, 2, 1, 3)을 선택하면 되므로 r의 최댓값은 4이다. r이 5 이상이 될 경우, 중복 없이 연속 부분을 선택하는 것이 불가능하다.

 

입력


첫째 줄에는 숫자의 개수 n이 주어진다. ( 1 ≤ n ≤ 100,000 ) 둘째 줄에 n개의 숫자가 주어진다. 각 숫자는 항상 1보다 크거나 같고, n보다 작거나 같다.  

출력


r의 최댓값을 출력한다.

 

예제 입력

10 1 3 1 2 4 2 1 3 2 1

예제 출력

4

 

예제 입력

7 7 1 4 2 5 3 6

예제 출력

7

#include <iostream>
using namespace std;

int ary[100050];
int visited[100050];
int maxV;

int main()
{
        int num;
        cin>> num;
        

        int dir=0;

        for(int i=0;i<num;i++)
                cin>>ary[i];

        int start=0;

        for(int i=0;i<num;i++)
        {
                while(visited[ary[i]] == 1)
                {
                        visited[ary[start++]]=0;
                        dir--;
                }
                visited[ary[i]] =1;
                dir++;
                if(maxV <dir)
                        maxV = dir;
        }

        cout<<maxV;

        return 0;
}

'알고리즘' 카테고리의 다른 글

[ 알고리즘 ] 2중 배열안에서 같은 수 찾기 ( 3중 for )  (0) 2019.09.04
구간의 합집합  (0) 2019.05.10
NN단표  (0) 2019.05.10
나무자르기  (0) 2019.05.10
2차식 정답 추측  (0) 2019.05.10

댓글