Programming/백준
[실버 3] 백준 28353 - 고양이 카페 (파이썬)
pental
2025. 4. 29. 13:53
https://www.acmicpc.net/problem/28353
풀이
- 고양이들의 체중 리스트가 주어지고,
- 두 마리 고양이를 묶을 때, 체중 합이 K 이하이면 1쌍으로 만든다.
- 최대 몇 쌍을 만들 수 있는지를 구하는 문제.
A.sort()
체중을 오름차순으로 정렬한다. 가장 가벼운 고양이와 가장 무거운 고양이를 매칭해서 최대한 많이 쌍을 만들려고 하기 때문이다.
투 포인터는 다음과 같이 준비한다.
start, end = 0, N - 1
count = 0
start는 제일 가벼운 고양이를 가리키며 왼쪽 포인터를 의미한다.
end는 제일 무거운 고양이를 가리키며 오른쪽 포인터를 의미한다.
count는 만든 쌍의 수를 나타낸다.
while start < end:
if A[start] + A[end] <= K:
count += 1
start += 1
end -= 1
else:
end -= 1
두 고양이의 체중 합 A[start] + A[end]를 확인하여, 합이 K 이하이면, 쌍을 만들 수 있으니까, count += 1하고 둘 다 포인터를 움직인다.
합이 K 초과이면 제일 무거운 고양이를 뺴야하니까, end -= 1만 진행한다.
else 에서 start += 1을 하면 안되는 이유는, start쪽 고양이는 여전히 쌍을 지을 수 있는데 기회를 날려버릴수 있기 때문이다.
중요!
코드
# 백준 28353 - 고양이 카페
# 분류 : 투포인터
N, K = map(int, input().split())
A = list(map(int, input().split()))
A.sort()
start, end = 0, N - 1
count = 0
while start < end :
if A[start] + A[end] <= K :
count += 1
start += 1
end -= 1
else :
end -= 1
print(count)