티스토리 뷰

반응형

기본적으로 투 포인터는 대부분 구간의 길이가 유동적으로 변한다.

그렇기에 최초로 최소가 되는 부분 문자열을 찾는다면 슬라이딩 윈도우 알고리즘이 더 효율적이다.

 

[1, 2, 3], 4, 5, 6, 7
1, [2, 3, 4], 5, 6, 7
1, 2, [3, 4, 5], 6, 7
1, 2, 3, [4, 5, 6], 7
1, 2, 3, 4, [5, 6, 7]

 

최소한의 계산으로 다음 배열의 합을 구한다.

그러려면 1+2+3과 2+3+4를 비교했을 때,  1은 빠지고 4가 들어오면 된다.

 

import sys
n= int(sys.stdin.readline())
b = [int(i) for i in sys.stdin.readline().rstrip().split()]

def max_bars_to_leave(n, bars):
    bars.sort()
    max_length = 0
    l = 0
    for r in range(2, n):
        while l < r - 1 and bars[l] + bars[l + 1] <= bars[r]:
            l += 1
        max_length = max(max_length, r - l + 1)
    return max_length
print(max_bars_to_leave(n, b))

위와 같이 한다면 l과 l+1은 더해지고, r을 반복하면서 계속해서 부분집합을 구한다.

그리고 해당하는 합 중에 만약 bar[l] + bars[l+1] >bars[r]로 넘어가는 지점이 존재한다면, 예를 들어 r이 80이고

l이 49번째 지점이라면, 루프는 bars[49] + bars[50]> bars[80]으로 끊기고,

마지막에  80-49+1로 해서 32가 최대로 남는 length가 된다.

 

 

반응형