문제 : 프로그래머스 구명보트 문제
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

처음에는 투포인터를 사용하지 않고 구현을 했다. 이 경우에는 O(n^2)의 시간복잡도를 가지기 때문에 시간 초과 문제가 발생했다.
def solution(people, limit):
answer = 0
people.sort(reverse=True)
end=len(people)-1
for i in range(len(people)):
if i >end: break
if people[i]>limit-40:
answer+=1
continue
for j in range(end, i,-1):
if people[i]+people[j]<=limit:
end=j-1
break
answer+=1
return answer
먼저 people 배열을 내림차순으로 정렬하고, 최대치와 최소치를 더한값을 비교하여 answer를 구해나간다. 시간초과를 해결하기 위해서 end 변수를 추가하고, limit - 40을 넘는 경우에는 패스하도록 하였지만 2개의 효율성 테스트 항목을 만족하지 못했다. 근본적으로 이 방법이 시간 복잡도 측면에서 효율이 좋지 않다는 것을 알게되었다.
해결 방법 : 투포인터
투포인터를 사용하게 되면 left 인덱스와 right 인덱스를 설정해야한다. 초기 설정은 left는 0번 인덱스, right는 가장 오른쪽 인덱스를 넣어둔다. 조건에 따라서 계속해서 l과 r 인덱스를 조정해나가면서 O(n) 의 시간복잡도로 구현이 가능하다.
def solution(people, limit):
answer = 0
people.sort(reverse=True)
l=0
r=len(people)-1
while l <=r:
if people[l]+people[r]<=limit:
answer+=1
l+=1
r-=1
continue
else:
l+=1
answer+=1
return answer
여기서 더 개선을 해보자면 while 안에서 l 인덱스는 어떤 경우에도 +1을 하기 때문에 조건 밖으로 빼고 while 문 첫 문장으로 넣어도 좋을거 같다.
'알고리즘 > Python' 카테고리의 다른 글
| [알고리즘] 프로그래머스 H-Index - Python (1) | 2026.08.19 |
|---|---|
| [알고리즘] 프로그래머스 점프와 순간 이동 - Python (1) | 2026.08.19 |
| [알고리즘] 프로그래머스 괄호 회전하기 - Python (0) | 2026.08.18 |
| [알고리즘] 프로그래머스 햄버거 만들기 - Python (0) | 2026.08.14 |
| [알고리즘] 프로그래머스 미로 탈출 - Python (1) | 2026.08.14 |