# 카누 선수
import sys
input = sys.stdin.readline
T = int(input())
for _ in range(T):
k, n = map(int, input().split())
arr = []
for _ in range(4):
arr.append(list(map(int, input().split())))
one, two = set(), set()
for idx in range(0, 4, 2):
for x in arr[idx]:
for y in arr[idx+1]:
one.add(x+y) if idx == 0 else two.add(x+y)
one = sorted(list(one))
two = sorted(list(two))
# 투포인터
result = 0
diff = sys.maxsize
i, j = 0, len(two)-1
while i < len(one) and 0 <= j:
temp = one[i]+two[j]-k
if abs(temp) < diff:
diff = abs(temp)
result = temp + k
elif abs(temp) == diff:
result = min(result, temp+k)
if temp < 0:
i += 1
elif temp > 0:
j -= 1
else:
break
print(result)
투포인터, 이분탐색, bisect
1. 입력을 받고 i, j 를 설정 (i = one을 왼쪽부터, j = two를 오른쪽부터)
2. 투포인터
- 범위 내이면 반복
- 두 수의 합에서 k를 빼기
- dff보다 차이가 적으면 diff수정, result 초기화
- diff랑 같으면, 더 작은 값으로 수정
3. result 출력
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 9370번 - 미확인 도착지 (파이썬) (0) | 2022.04.10 |
---|---|
[백준] 13904번 - 과제 (파이썬) (0) | 2022.04.09 |
[백준] 3151번 - 합이 0 (파이썬) (0) | 2022.04.08 |
[백준] 17951번 - 흩날리는 시험지 속에서 내 평점이 느껴진거야 (파이썬) (0) | 2022.04.06 |
[백준] 1365번 - 꼬인 전깃줄 (파이썬) (0) | 2022.04.05 |