coding_test/항해99 코테스터디 TIL
99클럽 코테 스터디 _ 5일차 TIL (투 포인터)
aeightchill
2025. 1. 17. 22:21
728x90
< 문제 >
< 풀이 >
코드 변수 정의
- liquids : 가지고 있는 랜선 길이 리스트
- min_diff : 두 용액의 합 중 0에 가까운 값
- liquid_sum : 현재 선택된 두 용액의 합
Two Pointers
시간복잡도 : O(N)
def binary_search(liquids, N):
left, right = 0, N - 1
min_diff, ans = float('inf'), [0, 0]
while left < right:
liquid_sum = liquids[left] + liquids[right]
if min_diff > abs(liquid_sum):
min_diff = abs(liquid_sum)
ans = [liquids[left], liquids[right]]
if liquid_sum < 0:
left += 1
else:
right -= 1
return ans
def f():
N = int(input())
liquids = sorted(list(map(int, input().split())))
print(*binary_search(liquids, N))
f()
- 투 포인터
- 투 포인터를 쓰기 위해서 용액의 특성값(liquids)을 오름차순으로 정렬한다.
- 두 용액의 합을 liquid_sum으로 지정하고
- 현재 특성값 합(min_diff) > abs(liquid_sum)
- min_diff = abs(liquid_sum)
- liquid_sum이 음수인 경우
- left += 1
- liquid_sum이 양수인 경우
- right += 1
< 회고 >
투 포인터로 이중 for문을 사용하지 않고 부분합을 찾을 수 있는 방법에 대해 생각할 수 있었다.
Two Pointers
- 리스트에 순차적으로 접근할 때 두 개의 점의 위치를 기록하면서 처리하는 알고리즘
- 시작점과 끝점 2개의 점으로 접근할 데이터의 범위를 표현할 수 있다.
(응용문제) _ 특정한 합을 가지는 부분 연속 수열 찾기
- 문제 설명
- N개의 자연수로 구성된 수열이 있다.
- 합이 M인 부분 연속 수열의 개수를 구하라
- 수행 시간 제한은 O(N)
- 문제 해결 아이디어
- 시작점(start)과 끝점(end)이 첫 번째 원소의 인덱스(0)를 가리키도록 한다.
- 현재 부분 합이 M과 같다면, 카운트한다.
- 현재 부분 합이 M보다 작다면, end += 1
- 현재 부분 합이 M보다 크거나 같다면, start += 1
- 모든 경우를 확인할 때까지 2번부터 4번 과정을 반복한다.
참고
이것이 코딩 테스트다 with Python
728x90