1 minute read

문제

두 전봇대 A와 B 사이에 하나 둘씩 전깃줄을 추가하다 보니 전깃줄이 서로 교차하는 경우가 발생하였다. 합선의 위험이 있어 이들 중 몇 개의 전깃줄을 없애 전깃줄이 교차하지 않도록 만들려고 한다.

예를 들어, < 그림 1 >과 같이 전깃줄이 연결되어 있는 경우 A의 1번 위치와 B의 8번 위치를 잇는 전깃줄, A의 3번 위치와 B의 9번 위치를 잇는 전깃줄, A의 4번 위치와 B의 1번 위치를 잇는 전깃줄을 없애면 남아있는 모든 전깃줄이 서로 교차하지 않게 된다.

img

전깃줄이 전봇대에 연결되는 위치는 전봇대 위에서부터 차례대로 번호가 매겨진다. 전깃줄의 개수와 전깃줄들이 두 전봇대에 연결되는 위치의 번호가 주어질 때, 남아있는 모든 전깃줄이 서로 교차하지 않게 하기 위해 없애야 하는 전깃줄의 최소 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 위치의 번호가 차례로 주어진다. 위치의 번호는 500 이하의 자연수이고, 같은 위치에 두 개 이상의 전깃줄이 연결될 수 없다.

출력

첫째 줄에 남아있는 모든 전깃줄이 서로 교차하지 않게 하기 위해 없애야 하는 전깃줄의 최소 개수를 출력한다.


풀이

어떤 경우에 전깃줄이 겹치지 않고 이어 질 수 있을지 부터 생각해보자. 두 전깃줄이 A - B 사이에서 평행하다면 겹치지 않을것이다. 두개의 전깃줄을 각 h_a1ㅡㅡㅡh_b1 , h_a2ㅡㅡㅡh_b2 라 하자. 두 전깃줄이 평행하기 위해서는 다음 두 조건 중 하나를 만족하면 된다.

  • h_a1 < h_a2 를 만족하면 h_b1 < h_b2 도 만족해야한다.
  • h_a1 > h_a2 를 만족하면 h_b1 > h_b2 도 만족해야한다.

즉 입력으로 주어지는 배열들을 한 전봇대를 기준으로 오름차순으로 정렬했을때 나머지 다른 전봇대에서의 수열이 이룰 수 있는 최대 증가수열을 구하면 그 증가수열의 갯수가 최대로 평행할 수 있는 전깃줄의 개수이고, 최소로 제거해야할 전깃줄은 전체 전깃줄의 개수에서 최대로 평행할 수 있는 전깃줄의 수를 빼면 알 수 있게된다.

n = int(input())

lines = []
for _ in range(n):
    lines.append(list(map(int,input().split())))

lines.sort(key = lambda x: x[0])
dp = [1]*n

for i in range(n):
    for j in range(i):
        if lines[j][1]<lines[i][1]:
            dp[i] = max(dp[i], dp[j]+1)

# print(dp)
print(n-max(dp))
10
1 6
2 8
3 2
4 9
5 5
6 10
7 4
8 1
9 7
10 3
[[1, 6], [2, 8], [3, 2], [4, 9], [5, 5], [6, 10], [7, 4], [8, 1], [9, 7], [10, 3]]
[1, 2, 1, 3, 2, 4, 2, 1, 3, 2]
6

배운점

규칙을 해결하기위헤 규칙에 해당되지 않는 부분부터 살펴보는 관점도 필요하다는걸 배웠다.

Leave a comment