[99클럽 5기] 코딩테스트 스터디 18일차 TIL - 우선순위 큐

2025. 2. 12. 17:07·Coding-Test/항해99
728x90
반응형

[Silver I] 맥주 축제 - 17503 

[문제 링크](https://www.acmicpc.net/problem/17503)

🗝️오늘의 학습 키워드 (Keyword)

  • 우선순위 큐
  • 정렬
  • 그리디

💻본인의 언어로 내용 정리 (Today I Learned)

맥주는 [선호도, 도수]로 표현이 된다. N일동안 N병의 맥주를 마셔야 할 때, 선호도가 M 이상이 되도록 하는 도수의 최솟값을 구해보자.

 

문제에서 함정이 여러 개 있었는데, 무조건 N병을 마셔야 한다는 것이고, 선호도가 M 이상이어야 한다는 것이다.

즉, 한 잔을 통해 호감도 M을 만족해도, N병까지 맥주를 마셔야 한다.

 

이 점에 유의하며 알고리즘을 설계해보자.

 

💡알고리즘 풀이

N, M, K = map(int, input().split())

# 맥주 종류 순으로 (선호도, 도수)
beers = []
for _ in range(K):
    v, c = map(int, input().split())
    beers.append((v, c))

beers.sort(key = lambda x : x[1]) # 도수 기준으로 정렬

입력받은 맥주에 대한 인자 값을 하나의 리스트에 담아준다. sort()를 통해 도수 기준으로 정렬한다.

 

list.sort(key = lambda x : x[1]) -> x = list, x[1] 에 대해서 정렬 시도

 

flavor = 0 # 맥주를 마신 후 선호도
heap = [] # 마신 맥주 저장

for beer in beers:
    if (len(heap) < N):
        heapq.heappush(heap, beer) # 맥주를 마시고
        flavor += beer[0] # 선호도 증가

        if (len(heap) == N): # N잔 마셨을 때
            if (flavor >= M): # 선호도가 M 이상이면
                print(beer[1]) # 그 때의 도수가 최솟값
                break
            else:
                flavor -= heapq.heappop(heap)[0] # 가장 처음 마신 맥주 제거

else: # 전체 조건에 맞지 않을 경우
    print(-1)

도수 순으로 정렬된 맥주를 차례대로 마신다.

 

힙에 마신 맥주를 저장하며, 맥주를 마실 때 마다 선호도의 합을 계산하고 이 값을 통해 목표 선호도와 비교를 진행한다. 조건에 맞지 않을 경우 힙에서 후순위로 미룬다. 이후 다음 맥주를 마시고, 선호도 검사 반복이다.

 

모든 조건을 만족하지 못하고 반복문을 빠져나왔을 경우, -1을 출력한다.

 

🗒️제출 코드

# 17503 맥주 축제

import heapq
import sys
input = sys.stdin.readline

N, M, K = map(int, input().split())

# 맥주 종류 순으로 (선호도, 도수)
beers = []
for _ in range(K):
    v, c = map(int, input().split())
    beers.append((v, c))

beers.sort(key = lambda x : x[1]) # 도수 기준으로 정렬

flavor = 0 # 맥주를 마신 후 선호도
heap = [] # 마신 맥주 저장

for beer in beers:
    if (len(heap) < N):
        heapq.heappush(heap, beer) # 맥주를 마시고
        flavor += beer[0] # 선호도 증가

        if (len(heap) == N): # N잔 마셨을 때
            if (flavor >= M): # 선호도가 M 이상이면
                print(beer[1]) # 그 때의 도수가 최솟값
                break
            else:
                flavor -= heapq.heappop(heap)[0] # 가장 처음 마신 맥주 제거

else: # 전체 조건에 맞지 않을 경우
    print(-1)

💭오늘의 회고

꽤나 복잡했던 문제였다.

정렬과 우선순위 힙을 통해 자료 구조를 정리하고, 그리디 알고리즘을 통해 전체를 탐색하는 그러한 문제였다.

 

알고리즘이 여러 개 섞일 수록 난이도가 올라가는 느낌을 받는다. 경우 마다 어떠한 알고리즘을 선택할지, 선택한 알고리즘의 순서를 어떻게 배치할 것인지에 대한 고뇌가 참 힘든 것 같다.

 

해결방법은 끊임없는 반복 밖에 없는 것 같기에 오늘도 열심히 공부하는 하루가 될 수 있도록.


⬇️전체 소스코드⬇️

 

hanghae99/python_middler/18일차 맥주 축제/맥주 축제.py at main · Do-heewan/hanghae99

개발자 커리어 개척 캠프 항해99 / 파이썬 미들러 노희완. Contribute to Do-heewan/hanghae99 development by creating an account on GitHub.

github.com

 

728x90
반응형
저작자표시 (새창열림)

'Coding-Test > 항해99' 카테고리의 다른 글

[99클럽 5기] 코딩테스트 스터디 20일차 TIL - 우선순위 큐  (2) 2025.02.14
[99클럽 5기] 코딩테스트 스터디 19일차 TIL - 그리디 알고리즘  (2) 2025.02.13
[99클럽 5기] 코딩테스트 스터디 17일차 TIL - 그리디 알고리즘  (2) 2025.02.11
[99클럽 5기] 코딩테스트 스터디 16일차 TIL - 그리디 알고리즘  (1) 2025.02.10
[99클럽 5기] 코딩테스트 스터디 15일차 TIL - 백트래킹  (1) 2025.02.09
'Coding-Test/항해99' 카테고리의 다른 글
  • [99클럽 5기] 코딩테스트 스터디 20일차 TIL - 우선순위 큐
  • [99클럽 5기] 코딩테스트 스터디 19일차 TIL - 그리디 알고리즘
  • [99클럽 5기] 코딩테스트 스터디 17일차 TIL - 그리디 알고리즘
  • [99클럽 5기] 코딩테스트 스터디 16일차 TIL - 그리디 알고리즘
희완
희완
희완한 코딩일상
    반응형
  • 희완
    Code-Heewan
    희완
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Python
        • 가상환경
      • Algorithm
      • Coding-Test
        • 백준
        • 프로그래머스
        • 항해99
      • Data-Analysis
      • 웹 개발
        • django
      • AWS
      • 공모전
      • Mobile
  • 링크

    • Github
  • 300x250
  • hELLO· Designed By정상우.v4.10.3
희완
[99클럽 5기] 코딩테스트 스터디 18일차 TIL - 우선순위 큐
상단으로

티스토리툴바