[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)  (0) 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)
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (196) N
      • SSAFY (10)
      • Algorithm (114) N
        • 이론 (6)
        • 백준 (BOJ) (107) N
        • 프로그래머스 (1)
      • Trouble Shooting (9)
      • Frontend (6)
      • React (17)
      • Next.js (4)
      • Vue (4)
      • Node.js (2)
      • HTML (9)
      • DevOps (4)
        • Git (4)
      • Language (9)
        • JavaScript (0)
        • Java (9)
      • Embedded (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
      • 자격증 (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    백준
    알고리즘
    우선순위큐
    구현
    Algorithm
    백트래킹
    html5
    Error
    강의
    React
    힙
    파이썬
    SSAFYcial
    싸피
    중복순열
    블록체인
    dfs
    티스토리챌린지
    Next.js
    오블완
    브루트포스
    중복조합
    Heap
    DP
    수학
    재귀
    Java
    SSAFY
    bfs
    순열
  • 최근 댓글

  • 최근 글

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

티스토리툴바