BOJ

백준 1449 - 수리공 항승

yanJuicy 2019. 4. 9. 19:52
반응형

문제

https://www.acmicpc.net/problem/1449

 

1449번: 수리공 항승

첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

풀이

테이프의 수가 최소가 돼야 하니 한 개의 테이프로 겹쳐서 막을 수 있는 곳을 최대한 찾아야 한다.

물을 막을 때 좌 우로 0.5만큼 간격을 필요로 하니 쓸 수 있는 테이프의 길이는 L - 1 이 된다.

물이 새는 곳의 위치를 덱에 정렬하여 저장하고, 덱에 있는 처음 데이터에서 사용 가능한 테이프의 길이를 더 했을 때 나온 값 보다 이하인 것 들은 테이프 하나로 막을 수 있다.

 

예를 들어, 테이프의 길이 L = 2 이고 막힌 곳이 1 2 3 5 이면

좌우 0.5씩 제거하면 L = 1이 되고 구멍 1부터 2까지 1개, 구멍 3 1개, 구멍 5 1개 총 3개가 필요하게 된다.

한 개의 테이프로 막을 수 있는 구멍들을 전부 제거하고 테이프 수를 늘린다.

이 과정을 반복한다.

 

 

소스 코드

C++

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
#include <iostream>
#include <deque>
#include <algorithm>
 
using namespace std;
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    int N, L;
    cin >> N >> L;
 
    deque<int> v;
 
    for (int i = 0; i < N; i++)
    {
        int num;
        cin >> num;
        v.push_back(num);
    }
 
    sort(v.begin(), v.end());
 
    int result = 0;
 
    int interval = L - 1;
 
    while (v.size())
    {
        int include = v[0+ interval;
        while (v[0<= include)
        {
            v.pop_front();
            if (!v.size()) break;
        }
        result++;
    }
    
 
    cout << result;
 
    return 0;
}
cs
반응형

'BOJ' 카테고리의 다른 글

백준 1463 - 1로 만들기  (0) 2019.05.12
백준 3085 - 사탕 게임  (0) 2019.05.12
백준 1912 - 연속합  (0) 2019.05.07
백준 1969 - DNA  (0) 2019.04.10
백준 2217 - 로프  (0) 2019.04.10