길이가 N인 수열이 주어졌을 때, 적절히 몇 개의 원소를 제거하여 삼각 수열을 만들고, 그중 가장 긴 부분 삼각 수열의 길이를 구하는 문제이다.
즉, 주어진 수열에서 일부 숫자를 골라 삼각 관계를 만족하는 가장 긴 부분 수열을 찾는 것이 목표이다.
import sys
def solution():
inp = sys.stdin.readline
int(inp())
arr = list(map(int, inp().split()))
arr.sort() # 정렬을 수행하여 작은 수부터 고려
res = min(2, len(arr)) # 기본적으로 길이는 최소 2 (최소한 두 개의 수는 선택 가능)
for i in range(len(arr) - 2): # 첫 번째 원소 고정
for j in range(i + 2, len(arr)): # 세 번째 원소를 선택
if arr[i] + arr[i + 1] > arr[j]: # 삼각 수열 조건 확인
res = max(res, j - i + 1) # 최대 길이 갱신
print(res)
if __name__ == "__main__":
solution()
수열 정렬
삼각 수열을 만들기 위해서는 정렬된 상태에서 숫자들을 선택하는 것이 유리하다.
최소 길이 설정
최소 길이 설정
수열 길이가 2 이하라면 삼각 수열을 만들 수 없다는 것과, 배열의 길이가 1인 경우를 고려
투 포인터를 활용한 탐색
i
를 첫 번째 원소로 고정하고, j
를 세 번째 원소로 설정하여 가능한 가장 긴 삼각 수열을 찾는다.
arr[i] + arr[i+1] > arr[j]
조건을 만족하는 경우, 가능한 부분 수열의 길이를 갱신한다.