https://www.acmicpc.net/problem/2565
2565번: 전깃줄
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는
www.acmicpc.net
풀이
문제를 보았을 때 알 수 있는 힌트
문제를 통해서 겹치는 구간을 없애기만 하면 되는 문제이다. 다시 말해서 최장 증가 부분 수열(LIS)로 문제를 풀면 된다.
다음에 관련해서 알고리즘을 작성해놓아야 좋을듯하다.
두가지 방식으로 풀었는데 dp와 이분탐색으로 문제를 해결하였다.
import sys
input = sys.stdin.readline
n = int(input())
n_list = []
for i in range(n):
n_list.append(list(map(int,input().split())))
n_list.sort()
# dp로 풀어보기
dp = [1]*n
for i in range(n):
for j in range(i):
if n_list[i][1]>n_list[j][1] and dp[i]<dp[j]+1:
dp[i]= dp[j]+1
print(n - max(dp))
# 전기줄
import sys
from bisect import bisect_left
input = sys.stdin.readline
n = int(input())
n_list = []
for i in range(n):
n_list.append(list(map(int,input().split())))
n_list.sort()
# 이분 탐색으로 풀어보기
x= [n_list[0][1]]
dp = [1]
for i in range(1, n):
if n_list[i][1]>x[-1]:
x.append(n_list[i][1])
dp.append(dp[-1]+1)
else:
idx = bisect_left(x,n_list[i][1])
x[idx] = n_list[i][1]
print(n - max(dp))
모두 이상없이 결과가 나왔고 효율적인 면에서는 이분 탐색이 효율적이다.
다만 이번 문제에서는 dp가 빨랐다.
https://github.com/dydwkd486/coding_test/blob/main/baekjoon/baekjoon2565.py
GitHub - dydwkd486/coding_test: 코딩테스트 공부한 내용 정리
코딩테스트 공부한 내용 정리. Contribute to dydwkd486/coding_test development by creating an account on GitHub.
github.com
'Coding Test > baekjoon' 카테고리의 다른 글
[백준 11404] 플로이드 - python (solved.ac - 골드 4) (0) | 2022.07.01 |
---|---|
[백준 2493] 탑 - python (solved.ac - 골드 5) (0) | 2022.06.30 |
[백준 2294] 동전 2 - python (solved.ac - 골드 5) (0) | 2022.06.28 |
[백준 15686] 치킨 배달 - python (solved.ac - 골드 5) (0) | 2022.06.26 |
[백준 5525] IOIOI - python (solved.ac - 실버 1) (0) | 2022.06.13 |