728x90
SMALL
백준 문제 풀이: 1654 [랜선 자르기]
문제 링크: https://www.acmicpc.net/problem/1654
문제 설명:
길이가 각각 다른 K개의 랜선을 최소한 N개의 같은 길이로 잘라야 합니다. 만들 수 있는 최대 랜선의 길이를 구하는 문제입니다.
문제 해결 코드
#include <iostream>
#include <algorithm>
using namespace std;
long long int arr[10001];
int main() {
int k, n;
cin >> k >> n;
int max = -1;
for (int i = 0; i < k; i++) {
cin >> arr[i];
if (max < arr[i]) {
max = arr[i];
}
}
long long int start = 1;
long long int end = max;
long long int cnt = 0;
long long int result = 0;
long long int mid;
while (start <= end) {
mid = (start + end) / 2;
cnt = 0;
for (int i = 0; i < k; i++) {
cnt += arr[i] / mid;
}
if (cnt < n) {
end = mid - 1;
} else {
start = mid + 1;
result = mid;
}
}
cout << result << endl;
}
코드 설명
- 핵심 아이디어: 이분 탐색을 활용하여 가능한 랜선의 최대 길이를 효율적으로 탐색합니다.
- 구현 세부사항:
start
: 이분 탐색의 시작 값 (최소 길이는 1).end
: 이분 탐색의 종료 값 (가장 긴 랜선의 길이).mid
: 현재 탐색 중인 랜선의 길이.- 각 길이로 자를 수 있는 랜선의 수를 계산하여
cnt
에 저장하고, 조건에 따라start
와end
를 조정합니다.
- 시간 복잡도: O(k log(max_length))
- 이분 탐색의 시간 복잡도는 O(log(max_length))입니다.
- 각 반복에서 k개의 랜선을 확인하므로 O(k)입니다.
결과
주어진 조건에서 만들 수 있는 최대 랜선 길이를 출력합니다. 이분 탐색을 활용하여 효율적으로 문제를 해결했습니다.
다른 접근 방식이나 질문이 있다면 댓글로 남겨주세요!
728x90
LIST
'BAEKJOON > 이분 탐색' 카테고리의 다른 글
백준 2467번 [용액](C++) -yes6686- 티스토리 (0) | 2025.01.04 |
---|---|
백준 1166번 [선물](C++) -yes6686- 티스토리 (3) | 2024.07.24 |
백준 16401번 [과자 나눠주기](C++) -yes6686- 티스토리 (0) | 2024.05.04 |
백준 2512번 [예산](C++) -yes6686- 티스토리 (0) | 2024.02.10 |
백준 1920번 [수 찾기](C++)-yes6686- 티스토리 (0) | 2023.12.21 |