본문 바로가기
코딩테스트 파이썬/백준

배 ( 1092 번 )

by 세용용용용 2025. 9. 2.

1092번: 배

 


🧠 알고리즘

  • 그리디(Greedy) + 정렬(Sorting) + Counter(해시맵) 기반 탐색

 

✔️ 동작 방식

  • 크레인 무게 제한을 내림차순 정렬
  • 가장 큰 크레인부터 처리
  • 가장 큰 크레인도 옮길 수 없는 박스가 있으면 즉시 -1 반환
  • 모든 박스를 옮기는 데 걸린 라운드 수(answer) 반환

 

 

🧾 코드

import sys
from collections import Counter

def _cr_max(b_s, crain_size):
    answer = 0
    for box_size in b_s.keys():
        if crain_size >= box_size:
            answer = max(answer, box_size)
    
    return answer
    

def _main(c_c, c_s, b_c, b_s):
    answer = 0
    c_s.sort(reverse=True)

    while b_s:
        answer += 1
        for now_c_idx in range(len(c_s)):
            if b_s:
                now_max_size = _cr_max(b_s, c_s[now_c_idx])
                if now_max_size:
                    b_s[now_max_size] -= 1
                    if b_s[now_max_size] == 0:
                        b_s.pop(now_max_size)
                else:
                    if now_c_idx == 0: # 젤 큰 크레인도 못담으면
                        return -1
                    else:
                        break
    return answer
            

c_count = int(sys.stdin.readline().rstrip())
c_size = list(map(int, sys.stdin.readline().rstrip().split()))
b_count = int(sys.stdin.readline().rstrip())
b_size = Counter(list(map(int, sys.stdin.readline().rstrip().split())))

print(_main(c_count, c_size, b_count, b_size))

 

 

⏱️ 시간 복잡도

while b_s : 조건 만족시 까지 탐색 ( 선형 시간 복잡도 )
	for now_c_idx in range(len(c_s)) : 큰 크레인 부터 탐색 ( 선형 시간 복잡도 )
		now_max_size = _cr_max(b_s, c_s[now_c_idx]) : 최대 박스 탐색 ( 선형 시간 복잡도 )
        
해당 알고리즘 시간 복잡도 : 삼차형 시간 복잡도 ( O(n ** 3) )

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

벽 부수고 이동하기 4 ( 16946 번 )  (0) 2025.09.06
단어 만들기 ( 1148 번 )  (0) 2025.09.06
트리 ( 1068 번 )  (0) 2025.09.02
물병 ( 1052 번 )  (0) 2025.09.02
감소하는 수 ( 1038 번 )  (0) 2025.09.01