TODAY TIL
안녕하세요, 오늘은 재미있는 코딩 문제를 함께 풀어보겠습니다. 이 문제는 센티라는 캐릭터가 마법의 뿅망치를 사용하여 자신보다 키가 큰 거인들을 줄여야 하는 상황입니다. 어떤 전략을 세우고 어떻게 코드를 구현했는지 차근차근 설명하겠습니다.
문제 설명
센티는 여행 중 거인의 나라에 도착했습니다. 그곳에는 자신보다 키가 크거나 같은 거인들이 많았는데, 센티는 이들을 마법의 뿅망치를 이용해 키를 줄이려 합니다. 마법의 뿅망치에 맞으면 키는 ⌊현재 키 / 2⌋로 줄어듭니다. 단, 키가 1이면 더 이상 줄어들지 않습니다. 이 마법의 뿅망치는 사용 횟수 제한이 있습니다.
목표: 센티가 마법의 뿅망치를 전략적으로 사용해 모든 거인이 센티보다 키가 작아지게 할 수 있는지를 판단하고, 그 과정에서 최소 사용 횟수를 출력합니다.
입력 형식
- 첫 번째 줄에 거인의 수 N, 센티의 키 HcentiH_{\text{centi}}, 마법의 뿅망치 사용 제한 T가 주어집니다.
- 두 번째 줄부터 N개의 줄에 각 거인의 키가 주어집니다.
출력 형식
- 마법의 뿅망치를 사용하여 모든 거인의 키가 HcentiH_{\text{centi}}보다 작다면 "YES"와 사용한 횟수를 출력합니다.
- 그렇지 않다면 "NO"와 뿅망치 사용 후 가장 큰 거인의 키를 출력합니다.
문제 풀이 접근법
- 최대 힙을 이용한 거인 선택:
- 거인들 중 가장 키가 큰 거인을 빠르게 선택하기 위해 최대 힙을 사용합니다.
- Python의 heapq 모듈은 기본적으로 최소 힙이므로, 음수로 변환하여 최대 힙처럼 사용합니다.
- 마법의 뿅망치 사용 전략:
- 가장 키가 큰 거인을 때리고 줄어든 키를 다시 최대 힙에 넣습니다.
- 키가 1인 경우는 줄일 수 없으므로 무시합니다.
- 제한된 사용 횟수 T를 초과하지 않도록 합니다.
- 결과 판단:
- 마법의 뿅망치를 사용한 후, 모든 거인의 키가 HcentiH_{\text{centi}}보다 작으면 성공이고, 그렇지 않다면 실패입니다.
코드 구현
import heapq
# 입력 처리
N, H_centi, T = map(int, input().split())
giants = []
for _ in range(N):
height = int(input())
heapq.heappush(giants, -height) # 최대 힙을 위해 음수로 저장
# 마법의 뿅망치 사용 횟수 카운트
use_count = 0
# 뿅망치 사용
while use_count < T and -giants[0] >= H_centi:
tallest = -heapq.heappop(giants)
if tallest == 1:
# 키가 1이면 더 이상 줄어들 수 없음
heapq.heappush(giants, -tallest)
break
# 뿅망치를 사용하여 키 줄이기
new_height = tallest // 2
heapq.heappush(giants, -new_height)
use_count += 1
# 결과 확인
if -giants[0] < H_centi:
print("YES")
print(use_count)
else:
print("NO")
print(-giants[0])
코드 설명
- 입력 처리:
- 첫 번째 줄에서 거인의 수, 센티의 키, 마법의 뿅망치 사용 제한을 읽어옵니다.
- 각 거인의 키를 음수로 변환하여 최대 힙에 저장합니다.
- 반복문:
- 최대 TT번의 반복 동안 가장 키가 큰 거인을 선택하여 키를 절반으로 줄입니다.
- 줄어든 키는 다시 힙에 삽입하여 다음 최댓값을 구할 수 있도록 합니다.
- 키가 1인 거인은 더 이상 줄일 수 없으므로 바로 종료합니다.
- 출력:
- 모든 거인의 키가 센티보다 작아졌다면 YES와 사용 횟수를 출력합니다.
- 그렇지 않다면 NO와 가장 큰 거인의 키를 출력합니다.
시간 및 공간 복잡도
- 시간 복잡도: O((T+N)logN)O((T + N) \log N)
- 공간 복잡도: O(N)O(N)
결론
이 문제는 우선순위 큐를 이용하여 가장 큰 값을 효율적으로 처리하는 방법과 제한된 자원을 최적화하여 사용하는 전략을 익히는 데 유용합니다. 블로그 포스팅을 통해 이와 같은 문제의 해결 방법을 체계적으로 학습해 보세요!
이제 여러분도 센티와 함께 거인의 나라를 정복해 보세요! 😊
'python' 카테고리의 다른 글
99클럽 코테 스터디_4기 22일차 TIL (0) | 2024.11.19 |
---|---|
99클럽 코테 스터디_4기 21일차 TIL (0) | 2024.11.18 |
99클럽 코테 스터디_4기 19일차 TIL (0) | 2024.11.16 |
99클럽 코테 스터디_4기 18일차 TIL (7) | 2024.11.15 |
99클럽 코테 스터디_4기 17일차 TIL (7) | 2024.11.14 |