티스토리 뷰

 

https://www.acmicpc.net/problem/2352

문제

도체를 설계할 때 n개의 포트를 다른 n개의 포트와 연결해야 할 때가 있다.

예를 들어 왼쪽 그림이 n개의 포트와 다른 n개의 포트를 어떻게 연결해야 하는지를 나타낸다. 하지만 이와 같이 연결을 할 경우에는 연결선이 서로 꼬이기 때문에 이와 같이 연결할 수 없다. n개의 포트가 다른 n개의 포트와 어떻게 연결되어야 하는지가 주어졌을 때, 연결선이 서로 꼬이지(겹치지, 교차하지) 않도록 하면서 최대 몇 개까지 연결할 수 있는지를 알아내는 프로그램을 작성하시오

입력

첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주어진다. 이 수들은 1 이상 n 이하이며 서로 같은 수는 없다고 가정하자.

출력

첫째 줄에 최대 연결 개수를 출력한다.

예제 입력 1
6
4 2 6 3 1 5
예제 출력 1
3

 

해설

음. DP 로 풀었음.

4 2 6 3 1 5 로 예를 들면. 처음 연결은 (1, 4) 가 연결된다. 

(1, 4)를 연결하면, 이후에 올 수 있는 숫자들은 4보다 큰 값들만 체크해야한다.(4보다 작으면 겹침)

따라서. 순차적으로 오른쪽 값들를 확인하면서 이전에 작은 값들이 있었는지 확인해야 한다.

 

예를 들어. 

subLists에 둘 수 있는 최대 값을 기록한다. 

(1, 4 ) 를 연결하면. 4는 1개 => subLists[4] = 1

(2, 2 ) 를 연결하면. 4 뒤에는 못오지만, 2 하나는 체크할 수 있다. => subLists[2] = 1

(3, 6) 을 연결하면, 6 보다 작은 숫자는 2와 4에 값중 큰 값에 추가할 수 있다. (2,4) 또는 (4, 6) => subLists[6] = max( subLists[2] + 1, subLists[4] + 1) = 2

(4, 3) 을 연결하면, 3 보자 작은 숫자는 2만 있음 => subLists[2] + 1 = 2 

(5, 1 ) 을 연결하면, 1 보다 작은 숫자는 없으므로 => subLists[1] = 1 

(6, 5 ) 를 연결하면, subLists[5] = max(subLists[1] , subLists[2], subLists[3], subLists[4]) + 1 = 3  이 된다. 

 

이후 subLists 에 있는 값 중 가장 큰 값을 출력하면 된다 . => 3

하지만 이 방법으로 했을 때 역순으로 값이 있을 경우 n*n 만큼의 시간 복잡도가 걸린다. 

greedy 로 풀지 못했다.

greedy 로 푸는 방법은 다음에 시도해봐야지

import sys
N = int(sys.stdin.readline())
datas = list(map(int,sys.stdin.readline().split(' ')))
subLists =  [0 for i in range(N)]
for val in datas:
    if (subLists[val-1] == 0) :
        subLists[val-1] = 1 
    tmp_max = subLists[val-1]
    for i in range(val): 
        if (subLists[i] > 0 and val-1 > i):
            if (subLists[i] + 1 > tmp_max):
                tmp_max = tmp_max + 1
    subLists[val-1] = tmp_max 
print(max(subLists))


# sample
N = 6
datas = list(map(int,"4 2 6 3 5 1".split(' ')))
subLists =  [0 for i in range(N)]

for val in datas:
    if (subLists[val-1] == 0) :
        subLists[val-1] = 1 
    tmp_max = subLists[val-1]
    for i in range(val): 
        if (subLists[i] > 0 and val-1 > i):
            if (subLists[i] + 1 > tmp_max):
                tmp_max = tmp_max + 1
    subLists[val-1] = tmp_max 
print(max(subLists))

 

반응형
댓글