아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

포렌식

시간 제한2초메모리 제한512 MB

요약
0번 인덱스에서 시작하는 포인터 체인이 -1에 도달하기 전에 서로 다른 인덱스를 최대한 많이 방문하도록 최대 하나의 배열 항목을 변경합니다.
난이도

보통10점 중 7점

유형
그래프, DFS
정답자
아직 제출이 없습니다

문제

배열 A의 예시

위 표는 배열 AA의 내용이고, 윗줄은 인덱스이다. 이 배열에는 단방향 연결 리스트의 포인터가 들어 있으며, 여기서 포인터는 그냥 정수 값이다. 첫 번째 노드의 포인터는 A[0]A[0]에 들어 있다. 즉 A[0]A[0]의 값이 두 번째 노드의 위치이다. 두 번째 노드의 포인터는 A[A[0]]A[A[0]]에, 세 번째 노드의 포인터는 A[A[A[0]]]A[A[A[0]]]에 들어 있고, 이런 식으로 이어진다. 포인터 값이 −1-1이면 연결 리스트의 끝이다. 위 예에서 A[0]A[0]의 값은 2이므로 두 번째 포인터는 A[2]A[2]에 있다. A[2]A[2]의 값은 4이므로 세 번째 포인터는 A[4]A[4]에 있다. A[4]A[4]의 값은 −1-1이므로 뒤에 오는 노드가 없다. 포인터가 이어지는 순서는 다음과 같고, 이 연결 리스트의 노드는 3개이다.

A[0]=2→A[2]=4→A[4]=−1A[0] = 2 \rightarrow A[2] = 4 \rightarrow A[4] = -1

당신은 이런 배열의 값을 넘겨받았고, 그중 한 칸이 다른 값으로 바뀌었다는 이야기도 함께 들었다. 어느 칸인지도, 새로 들어간 값이 무엇인지도 알지 못한다. 새 값이 원래 값과 같아서 배열이 그대로일 수도 있다. 포렌식 전문가인 당신은 원래 배열을 되살리려 한다. 그래서 한 칸만 고쳐서, 고친 배열이 나타내는 연결 리스트의 노드 수를 가장 크게 만들려고 한다. 위 예를 보자.

  • A[4]A[4]를 6으로 고치면 노드가 4개인 연결 리스트가 된다.
  • A[0]A[0]을 7로 고치면 노드가 4개인 연결 리스트가 된다.
  • A[0]A[0]을 9로 고치면 연결 리스트가 성립하지 않는다.
  • A[2]A[2]를 7로 고치면 노드가 5개인 연결 리스트가 된다.

한 칸을 고치는 모든 방법과 아무 칸도 고치지 않는 경우를 통틀어, 노드 5개짜리가 가장 크다. 따라서 A[2]A[2]의 원래 값이 7이었을 가능성이 높다. 이렇게 되살릴 수 있는 연결 리스트의 최대 노드 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 배열의 크기 NN이 주어진다. 둘째 줄에 배열의 원소 NN개가 A[0]A[0]부터 차례대로 공백으로 구분되어 주어진다. 각 원소는 −1-1 이상 NN 미만의 정수이다.

출력

되살린 연결 리스트 가운데 노드 수가 가장 많은 것의 노드 수를 출력한다.

예제5

  1. 예제 1

    입력
    10
    2 5 4 4 -1 1 -1 3 0 8
    
    예상 출력
    5
    
  2. 예제 2

    입력
    4
    0 0 0 0
    
    예상 출력
    1
    
  3. 예제 3

    입력
    6
    1 2 3 4 5 -1
    
    예상 출력
    6
    
  4. 예제 4

    입력
    10
    2 5 4 4 0 1 -1 3 0 8
    
    예상 출력
    4
    
  5. 예제 5

    입력
    10
    2 5 4 4 -1 1 -1 6 0 8
    
    예상 출력
    5