https://www.acmicpc.net/problem/1365
1365번: 꼬인 전깃줄
첫 줄에 전봇대의 개수 N(1 ≤ N ≤ 100,000)이 주어지고, 이어서 N보다 작거나 같은 자연수가 N개 주어진다. i번째 줄에 입력되는 자연수는 길 왼쪽에 i번째 전봇대와 연결된 길 오른편의 전봇대가
www.acmicpc.net
문제
풀이
import sys
input = sys.stdin.readline
n = int(input().rstrip())
pole = list(map(int, input().rstrip().split()))
def binary_search(left, right, target):
while left < right:
mid = (left + right) // 2
if list[mid] < target:
left = mid + 1
else:
right = mid
return right
list = []
list.append(pole[0])
for i in range(1, n):
if list[-1] < pole[i]:
list.append(pole[i])
else:
a = binary_search(0, len(list)-1, pole[i])
list[a] = pole[i]
print(n - len(list))
LIS 알고리즘을 이용하는 이진탐색 코드입니다.
Try : 일차함수를 이용해서 하려고 했는데 시간 복잡도에서 O(n^2)가 나와서 초과 됐습니다.
import sys
input = sys.stdin.readline
n = int(input().rstrip())
pole = list(map(int, input().rstrip().split()))
def linear_function(x_intercept, y_intercept):
a = -(y_intercept / x_intercept)
b = y_intercept
list = []
list.append(a)
list.append(b)
return list
def find_conatct(a1, b1, a2, b2):
a = a1 - a2
b = b2 - b1
if a / b > 0:
return True
else:
return False
linear = [[0] for _ in range(n)]
for i in range(n):
linear.append(linear_function((i+1), pole[i]))
print(linear[i])
contact = [0 for _ in range(n)]
for i in range(n):
for j in range(n):
if i!=j:
if find_conatct(linear[i][0], linear[i][1], linear[j][0], linear[j][1]):
contact[i] += 1
min_contact = min(contact)
print(min_contact)
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 피로도 - Java (0) | 2024.02.01 |
---|---|
[프로그래머스] 신고 결과 받기 - Python (0) | 2024.01.13 |
[백준] 1202번 '보석 도둑' - Python (2) | 2023.12.27 |
[백준] 1113번 '수영장 만들기' - Python (2) | 2023.12.22 |
[백준] 2252번 '줄 세우기' - Java (1) | 2023.09.03 |