BOJ
이진 탐색 2110 공유기 설치
문제
N(5 ≤ N ≤ 1,000)개의 자연수들로 이루어진 집합 U가 있다. 이 중에서 적당히 세 수를 골랐을 때, 그 세 수의 합 d도 U안에 포함되는 경우가 있을 수 있다. 이러한 경우들 중에서, 가장 큰 d를 찾으라.
예를 들어 {2, 3, 5, 10, 18}와 같은 집합이 있다고 하자. 2+3+5 = 10이 되고, 이 수는 집합에 포함된다. 하지만 3+5+10 = 18이 되고, 이 경우가 세 수의 합이 가장 커지는 경우이다.
입력
첫째 줄에 자연수 N이 주어진다. 다음 N개의 줄에 차례로 U의 원소가 하나씩 주어진다. 주어진 U는 집합이 되므로 입력되는 두 수가 같아서는 안 된다. U의 원소는 200,000,000보다 작거나 같은 자연수이다. 답이 항상 존재하는 경우만 입력으로 주어진다.
예제 입력
"""
case 1:
입력
5
2
3
5
10
18
출력
18
"""
풀이
x+y+z=k를 반복문을 돌며 탐색한다면 N^3의 시간이 소요된다. 하지만 x+y=k-z 로 식을 치환해서 반복문을 돈다면 N^2의 시간이 소요되므로 더 빠른 속도로 문제를 해결할 수 있다. 또한 x+y를 set 자료구조에 추가하여 중복을 자동으로 제거한다.
코드
def solution(array, n):
array.sort()
sum_set = set()
for i in range(n):
for j in range(n):
sum_set.add(array[i] + array[j])
answer = []
for i in range(n-1, -1, -1):
for j in range(i+1):
if array[i] - array[j] in sum_set:
answer.append(array[i])
break
answer.sort()
return answer[-1]
if __name__ == "__main__":
n = int(input())
array = []
for _ in range(n):
array.append(int(input()))
print(solution(array, n))
댓글남기기