본문 바로가기

알고리즘/BOJ

1654번

1654번 - 랜선 자르기


이분 탐색에 대해서 종만북으로 한번 보고 풀어본 문제.


만약 내가 이 문제가 이분탐색 문제라는 걸 몰랐다면 풀 수 있었을까? 이런 고민을 많이 한다.


이분 탐색도 결국은 주어진 범위 내에서 해가 있을 때, 완전 탐색을 좀 빠르게 하는 방식? 이라고 나는 이해했다..


앞으로 몇 문제를 더 풀어보면서 익혀야겠다.


decision() 함수를 통해 결정 문제로 바꾸고, 이분탐색을 통해 최적값을 찾도록 하였다.


문제에서 실수 2가지


1. 처음에 high 값을 vector.back() 으로 넣었는데 , 이러면 만약 답이 high 값이 될 경우에는 lo 가 high 에 막혀서 못 올라가는 경우가 생겼다.

   

   그래서 high 값을 vector.back() + 1값으로 바꿔주었다.


   마찬가지로, 물론 이 문제에서는 오류가 없었지만, lo 값도 0이 아닌 -1로 바꿔줘야 한다는 걸 깨달았다.


2. 랜선의 크기가 int 형을 넘을 수 있다는 점을 생각해내지 못해서 실수가 있었다. 이건 종종 있는 일이므로 더욱 조심할 것.


   변수형을 생각없이 습관적으로 사용하는 버릇을 조금 고칠 필요가 있다. 

   



<정답 코드>


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
bool decision(const vector<long long> &v, long long mid, int n)
{
    int ans = 0;
    for (int i = 0; i<v.size(); i++)
    {
        ans += (v[i] / mid);
    }
    return ans>=n;
}
 
int main()
{
    int N, K;
    vector<long long> v;
 
    cin >> K >> N;
    for (int i = 0; i < K; i++)
    {
        long long tmp;
        cin >> tmp;
        v.push_back(tmp);
    }
 
    sort(v.begin(), v.end());
    
    long long lo = -1;
    long long high = v.back() + 1;
    long long mid;
 
    for (int i = 0; i < 100; i++)
    {
        mid = (lo + high) / 2;
 
        if (decision(v,mid,N))
        {
            lo = mid;
        }
        else
        {
            high = mid;
        }
    }
 
    cout << lo << endl;
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

10815번  (0) 2017.11.25
2805번  (0) 2017.11.25
1967번  (0) 2017.11.23
1167번  (0) 2017.11.23
11725번  (0) 2017.11.23