[Python] 백준/BOJ 23757번: 아이들과 선물 상자 (Silver 2)

2025. 1. 27. 18:00·Algorithm/백준 (BOJ)

💻 Problem

문제 보러 가기

 

상훈이는 N개의 선물 상자를 가지고 있다. 선물 상자에는 현재 담겨있는 선물의 개수가 적혀있다.

선물을 받을 아이들이 M명 있다. 아이들은 각자 1에서 M까지의 서로 다른 번호를 하나씩 부여받았다.

 1번 아이부터 M번 아이까지 한 번에 한 명씩, 현재 선물이 가장 많이 담겨있는 상자에서 각자 원하는 만큼 선물을 가져간다. 이때, 앞서 누군가 선물을 가져갔던 선물 상자에서 또다시 가져가도 상관없다.

하지만 상자에 자신이 원하는 것보다 적은 개수의 선물이 들어있다면, 선물을 가져가지 못해 실망한다.

상훈이는 한 명이라도 실망하지 않고 모두가 선물을 가져갈 수 있는지 궁금하다.

 

💡 Approach

heapq 모듈을 활용하여 최대 힙을 구현했다.

최대 힙의 경우 최소 힙과 동일하게 구현하고 원소를 넣을 때 음수로 넣으면 된다.

음수로 넣었으니 원소를 빼서 사용할 때는 다시 양수로 만들어줘야 한다.

 

입력을 처리한 후에는 아래와 같은 로직으로 구현했다.

1. 아이들을 한 명씩 처리한다
2. 현재 선물이 가장 많이 담겨있는 상자를 꺼낸다
3. 상자에 자신이 원하는 것보다 크거나 같은 개수의 선물이 들어있다면 선물을 가져간다
3-1. 이때, 아이가 선물을 가져가고도 상자에 선물이 남아있으면 다시 present에 push 한다
4. 상자에 자신이 원하는 것보다 적은 개수의 선물이 들어있다면, 선물을 가져가지 못한다 (즉시 종료)

 

✏️ Solution

import sys
import heapq
input = sys.stdin.readline

n, m = map(int, input().split()) # 선물 상자의 수, 아이들의 수
present = [-int(num) for num in input().split()] # 선물 상자에 들어있는 선물의 개수
children = list(map(int, input().split())) # 각 아이가 원하는 선물의 개수
heapq.heapify(present)

for child in children:
    x = -heapq.heappop(present)
    # 상자에 자신이 원하는 것보다 크거나 같은 개수의 선물이 들어있다면 선물을 가져간다
    if x >= child:
        if (x - child) > 0:
            heapq.heappush(present, child - x)
    # 상자에 자신이 원하는 것보다 적은 개수의 선물이 들어있다면, 선물을 가져가지 못한다
    else:
        print(0)
        exit()
print(1)

3-1(x - child > 0) 코드는 없어도 가능하다.

선물이 남아 있을 때만 넣어야 된다고 생각했는데 최대 힙이여서 0을 넣어도 계산할 일이 없어 상관없다.

 

시간복잡도: O(n + m log n)

heapify의 시간복잡도가 O(n)이고, 아이들의 선물을 처리하는 반복문 코드가 O(m log n)이다.

반응형

'Algorithm > 백준 (BOJ)' 카테고리의 다른 글

[Python] 백준/BOJ 5555번: 반지 (Silver 5)  (0) 2025.01.29
[Python] 백준/BOJ 28913번: 최애의 팀원 (Silver 3)  (0) 2025.01.28
[Python] 백준/BOJ 1927번: 최소 힙 (Silver 2)  (0) 2025.01.26
[Python] 백준/BOJ 20920번: 영단어 암기는 괴로워 (Silver 3)  (1) 2025.01.25
'Algorithm/백준 (BOJ)' 카테고리의 다른 글
  • [Python] 백준/BOJ 5555번: 반지 (Silver 5)
  • [Python] 백준/BOJ 28913번: 최애의 팀원 (Silver 3)
  • [Python] 백준/BOJ 1927번: 최소 힙 (Silver 2)
  • [Python] 백준/BOJ 20920번: 영단어 암기는 괴로워 (Silver 3)
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (146) N
      • SSAFY (10)
      • Algorithm (72) N
        • 이론 (5)
        • 백준 (BOJ) (66) N
        • 프로그래머스 (1)
      • Language (9)
        • JavaScript (0)
        • TypeScript (0)
        • Java (9)
        • Python (0)
      • Library & Runtime (15)
        • React (13)
        • Node.js (2)
      • Framework (9)
        • 이론 (2)
        • Next.js (3)
        • Vue (4)
      • DevOps (3)
        • Git (3)
      • WEB (18) N
        • HTML (9)
        • error (7) N
        • etc (2)
      • Computer (5)
        • 자격증 (2)
        • tip (2)
        • etc (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    SSAFYcial
    카카오맵
    딕셔너리
    티스토리챌린지
    파이썬
    dfs
    bfs
    재귀
    vue
    자바
    kakaomap
    우선순위큐
    해시
    누적합
    Algorithm
    알고리즘
    블록체인
    SSAFY
    DP
    Error
    html5
    렌더링최적화
    React
    github
    싸피
    Java
    강의
    오블완
    Next.js
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
올콩
[Python] 백준/BOJ 23757번: 아이들과 선물 상자 (Silver 2)
상단으로

티스토리툴바