# 2565 전깃줄 N = int(input()) dp = [0]*501 arr = [] for _ in range(N): n1,n2 = map(int,input().split()) arr.append((n1,n2)) arr.sort() result = [] result.append(arr[0][1]) temp = 0 for k1,k2 in arr[1:]: for ind,val in enumerate(result): if val > k2 and k2 not in result: result[ind] =k2 temp = 0 elif val < k2 and k2 not in result: temp = k2 if temp: result.append(temp) temp = 0 print(N-len(result))
개인적으로 어려워 하는 LIS 계열의 문제였다.
전깃줄 A를 기준으로 sort를 해준 다음에, 전깃줄 B를 기준으로 가장 긴 증가하는 수열의 구해주면 된다.
그렇게 되면, 선이 꼬이지 않고 설치할 수 있는 최대수가 되고, 주어진 N에서 최대수를 빼주면 된다.
코드 자체를 설명해보면 초기값으로 가장 첫번쨰 B 전깃줄을 넣어주고,
전체 데이터 들어진 행렬을 반복문을 돌리면서, LIS가 저장된 값과 비교를 하면서 LIS에 저장된 값보다 적으면 바로 그자리를 교체 해준다. 그리고 LIS가 저장된 값보다 전부다 크면 끝에 추가해주면 된다.
이 방법은 실제 LIS의 수열을 구하는 것이 아닌, 최장 길이를 구하기 위한 O(Nlogn)의 방식이다. 만약 실제 LIS를 구해야 하는 경우에는 다른 풀이를 찾아야한다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 18231 파괴된 도시 (0) | 2021.01.18 |
---|---|
[BOJ/백준] 9252 LCS 2 (0) | 2021.01.17 |
[BOJ/백준] 1038 감소하는 수 (0) | 2021.01.16 |
[BOJ/백준] 11052 카드 구매하기 (0) | 2021.01.16 |
[BOJ/백준] 17086 아기 상어 2 (0) | 2021.01.15 |