티스토리 뷰
📍 문제 탐색하기
프로그래밍 대회 전날, 은상과 친구들은 술집에서 주어진 막걸리 주전자를 최대한 동일한 양으로 나눠 마시려고 한다.
주어진 막걸리를 K명의 사람에게 똑같은 양으로 나눌 때, 최대 용량(ml)을 구하는 것이 목표이다.
문제 조건 분석
- 입력 조건
- 첫 번째 줄:
- N (막걸리 주전자의 개수, N≤10,000)
- K (사람의 수, K≤1,000,000 )
- 두 번째 줄부터: 각 주전자의 용량 (자연수, 최대 2^31 - 1)
- 첫 번째 줄:
- 출력 조건
- 나눠줄 수 있는 최대 막걸리 용량(ml) 출력
가능한 문제 해결 전략
- 완전 탐색 (Brute Force)
- 1ml부터 최댓값까지 모든 용량을 시도하는 방법 → 시간 초과 가능성 높음
- 시간 복잡도: O(K×N)
- 이분 탐색(Binary Search) 적용 (최적 해법)
- 가능한 용량 범위를 설정하고 이분 탐색을 통해 최적의 답을 찾음.
- 시간 복잡도: O(NlogM), M은 최대 용량.
📍 코드 설계하기
알고리즘 아이디어
- 초기화 단계
- start = 1 (최소 나눌 수 있는 양은 1ml)
- end = max(pot) (최대로 나눌 수 있는 양)
- 이분 탐색 수행
- mid 값을 기준으로 각 주전자의 막걸리를 mid만큼 나누어 몇 명에게 나눠줄 수 있는지 계산.
- 조건 분기:
- cnt >= K: 더 큰 용량이 가능 → start를 증가.
- cnt < K: 용량을 줄여야 함 → end를 감소.
- 결과 출력
- 최종적으로 최대 용량을 출력.
📍 시도회차 및 수정 사항
import sys
input = sys.stdin.readline
# 입력 받기
N, K = map(int, input().split())
# 주전자 용량 입력
pot = []
for _ in range(N):
pot.append(int(input()))
# 이분 탐색 초기 범위 설정
start = 1
end = max(pot)
result = 0
while start <= end:
mid = (start + end) // 2
cnt = 0 # 현재 mid 용량으로 몇 명에게 나눌 수 있는지 계산
for i in range(N):
cnt += pot[i] // mid # mid 용량으로 나눈 몫을 더함
if cnt >= K: # K명 이상 나눠줄 수 있으면, 용량을 늘려보기
result = mid
start = mid + 1
else: # K명보다 적게 나눠질 경우, 용량을 줄여야 함
end = mid - 1
print(result)
'알고리즘' 카테고리의 다른 글
[알고리즘] 백준 파이썬 2564 경비원 (0) | 2025.01.24 |
---|---|
[알고리즘] 백준 파이썬 25418 정수 a를 k로 만들기 (1) | 2025.01.22 |
[알고리즘] 백준 파이썬 2467 용액 (0) | 2025.01.21 |
[알고리즘] 백준 파이썬 2805 나무 자르기 (0) | 2025.01.20 |
[알고리즘] 백준 파이썬 11663 선분 위의 점 (0) | 2025.01.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- elasticsearch
- 스프링 북마크
- 스프링 커뮤니티
- 웹MVC
- 프론트엔드
- EnumType.ORDINAL
- 북마크
- 인텔리제이
- SQLD
- 회원탈퇴
- 로그아웃
- 자바
- SQL
- 스프링
- DP
- 파이썬
- 자바 스프링
- 스프링부트
- 지연로딩
- 백준 파이썬
- 로깅
- 준영속
- 커뮤니티
- 비영속
- 다이나믹 프로그래밍
- SQL 레벨업
- 영속
- 웹 MVC
- JPA
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
글 보관함