사용 언어 - Python3
문제 - 22988번 재활용 캠페인
투포인터 : 가능성을 지워주는 방법
https://www.acmicpc.net/problem/22988
정답
(투포인터) 양쪽 끝에서 비교하면서 만나면 종료
두 병의 용량 반납 -> (A+B+X/2) 용량이 담긴 새로운 용기
s = 시작포인터 = 0
e = 끝포인터 = n-1
cnt = 채워진 용기 개수
remain = 짜투리 용기 개수
총 용량 13(x)일 때,
1. B가 13이면, 이미 채워져 있는 것이므로 cnt += 1, e-=1 continue
2. 두 용기의 합(A+B)이 6.5 이상이라면, 두 병을 제거하고 새로운 용기 받기 cnt += 1, e-=1, s+=1
3. 짜투리
두 수를 합했는데, 6.5를 넘지 않는다면, e를 아무리 줄여도 6.5를 넘지 않는다.
1 2 3 5
1+5 6.5 넘지 않음 => 1+3, 1+2도 모두 6.5 넘지 않음. 오름차순 정렬되어있기 때문
end 포인터는 그대로 두고 start만 올린다 e+= 1
1은 그냥 짜투리로 넣어준다. remain+= 1
2+3 6.5 넘지 않음 => 2는 짜투리로 넣어준다. remain += 1 e+= 1
3에서 투포인터 만남.
투포인터가 만났다면, 그것도 아무것도 합해질 수 없으므로 짜투리로 넣어준다. remain+= 1
4. 짜투리 용기 처리
짜투리 용기가 3개라면, 용량이 무엇이던지
용기1 + 용기2 -> new 용기 + 용량 6.5
new 용기 + 용기3 -> new 용기 + 용량 13
짜투리 용기가 3개일 때마다 가득찬 용기는 1개 생성된다.
remain//3
n, x = map(int,input().split()) # 용기의 수, 용기의 총 용량
arr = sorted(list(map(int,input().split()))) # 각 병에 남아있는 용량
s = 0
e = n-1
remain = 0
cnt = 0
while s <= e: # s와 e가 교차되면 멈춘다
if arr[e] == x:
cnt += 1
e -= 1
continue
if s == e:
remain += 1 # 짜투리를 하나 추가한다.
break
if arr[s] + arr[e] >= (x/2):
cnt += 1
e -= 1
s += 1
else:
remain += 1
s += 1 # 수가 커진다.
print(cnt+remain//3)
레퍼런스
- 깃허브 정답
'Algorithm > 구현' 카테고리의 다른 글
[프로그래머스 lv 1] PCCP 기출 1번 붕대감기 (0) | 2023.12.04 |
---|---|
[백준] 16472번 고냥이 (투포인터 문제) (0) | 2023.11.03 |
[백준] 3273번 두 수의 합 (투포인터 문제) (0) | 2023.11.02 |
[백준] 3020번 개똥벌레 (1) | 2023.10.24 |
[백준] 11600번 구간 합 구하기 5 (0) | 2023.10.24 |
댓글