[C++][백준 BOJ]1449_수리공 항승.
Algorithm/BaeKJoon

[C++][백준 BOJ]1449_수리공 항승.

문제 번호

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

 

1449번: 수리공 항승

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

www.acmicpc.net

 

 

알고리즘 분류

그리디(greedy), 정렬(sort)

 

문제 풀이

 구멍난 위치가 가까운 곳부터 먼곳순서로 정렬한다. 문제에서 구멍난곳 양쪽으로 0.5씩 간격이 있어야 한다고 했다.

그래서 (i 번째) + L >= (i+N)번째 +1 의 조건에 만족한다면 i번째에서 시작해서 i+N 번째 까지 같은 테이프로 막을 수 있다고 생각했다. 소수점 계산을 피하기 위해서 0.5씩 필요한 간격을 한쪽으로 몰아준것이다.

 

정렬을 위해서 우선순위 큐를 사용하였다. 

 

전체코드

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

void Insert(priority_queue<int, vector<int>, greater<int> > &pipe, int N)
{
    for (int i = 0; i < N; i++)
    {
        int num;
        cin >> num;
        pipe.push(num);
    }
}

int Solution(priority_queue<int, vector<int>, greater<int> > &pipe, int L)
{
    int answer = 0;
    int temp = pipe.size();

    while (1)
    {
        answer++;
        int start = pipe.top() + L;

        while (temp != 0)
        {
            if (pipe.top() +1 <= start)
            {
                pipe.pop();
                temp--;
            }
            else
                break;
        }

        if(temp == 0 )
            break;
    }

    return answer;
}

int main()
{
    int N,L; cin >> N >> L;
    priority_queue<int, vector<int> , greater<int> > pipe;

    Insert(pipe,N);
    cout << Solution(pipe,L);

    return 0;
}

 

특이사항

 그동안은 문제풀이를 할때 거의 벡터만 사용했었는데 다른 자료구조, STL을 많이 사용해보아야겠다.

 

'Algorithm > BaeKJoon' 카테고리의 다른 글

[C++][백준 BOJ]14502_연구소.  (2) 2021.07.06
[C++][백준 BOJ]4963_섬의 개수.  (0) 2021.07.05
[C++][백준 BOJ]1202_보석 도둑.  (0) 2021.07.05
[C++][백준 BOJ]16953_A->B.  (0) 2021.07.02
[C++][백준 BOJ]1080_행렬.  (0) 2021.07.02