Coding Test/Programmers
[Python] 프로그래머스 알고리즘 고득점 Kit ✅ 탐욕법 (Greedy) (~ing)
hyeeein
2025. 2. 20. 02:59
[Level 1] 체육복
def solution(n, lost, reserve):
# 조건 5 (본인 것 잃어버린 경우, 본인 옷으로 대체)
set_lost = set(lost) - set(reserve) # 차집합 활용하여 공통 부분 제거
set_reserve = set(reserve) - set(lost)
# 한 명씩 옷 매칭해서 제외 (여벌 가진 3번은 2번과 4번에게만 빌려줄 수 있음 !!)
for r in set_reserve:
if r-1 in set_lost:
set_lost.remove(r-1)
elif r+1 in set_lost:
set_lost.remove(r+1)
answer = n - len(set_lost)
return answer
[Level 2] 구명보트
- 앞에부터 50+50 이렇게 하려고 하지 말고, 20+80을 먼저 없애버리는 방식으로 풀이
def solution(people, limit):
answer = 0
# 1) 무게 순서대로 정렬
people.sort()
# 순서대로 더해서 limit 보다 넘으면 answer 값 하나 추가하면 22점 나옴
# [다른 방식] 제일 첫 값과 마지막 값을 더했을 때, limit 보다 작으면 구출하고 리셋하는 방식
start = 0
end = len(people)-1
while (start <= end):
# 20, 80키로로 예를 들면 가능하면 둘이 한 번에 구출
if (people[start]+people[end]) <= limit:
start += 1
end -= 1
# 50, 80키로면 뒤에 있는 80키로라도 먼저 구출
else:
end -= 1
answer += 1
return answer
[Level 2] 큰 수 만들기
- 스택을 활용하자 (pop)
def solution(number, k):
answer = ''
# 숫자 리스트로 변환
number_ = list(number) # ['1', '9', '2', '4']
number_list = [int(i) for i in number_] # [1, 9, 2, 4]
# 스택 활용
stack = []
for num in number_list:
# 스택이 비어 있지 않고, 스택의 마지막 값이 num보다 작으며, k가 0보다 클 때
while stack and stack[-1] < num and k > 0:
k -= 1
stack.pop()
stack.append(num)
# k가 0이 아닌 경우 맨 마지막 숫자부터 삭제
if k != 0:
stack = stack[:-k]
stack_ = [str(i) for i in stack]
answer = ''.join(stack_)
return answer
[Level 2] 조이스틱
[Level 3] 섬 연결하기