본문 바로가기
알고리즘/백준

[백준 26152] 플래피 버드 스코어링 (C++)

by fortissimo 2024. 5. 14.

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

 

문제


플래피 버드는 장애물을 피해 최대한 멀리까지 도달하는 게임이다.

하나의 장애물을 피할 때마다 점씩 점수를 얻게 된다. 게임에는 총 개의 장애물이 존재하고, 번째 장애물은 두 개의 장애물로 표현된다. 상단 장애물 끝 지점의 위치는 𝐴𝑖로 나타내어지고, 하단 장애물 끝 지점의 위치는 𝐵𝑖로 나타내어진다.

플래피 버드 고수 세정이는 장애물이 어떤 식으로 주어지든 플래피 버드를 조작해 피할 수 있다. (단, 플래피 버드의 크기가 장애물의 틈새보다 클 경우에는 세정이도 장애물을 피하지 못한다.) 즉, 플래피 버드의 크기 𝑤가 장애물의 틈새보다 클 경우에는 장애물을 피하지 못한다. 이때, 장애물을 피하지 못하면 게임이 바로 끝나게 된다.

 

여러 종류의 플래피 버드가 각 게임마다 주어질 때, 해당 플래피 버드를 가지고 몇 점까지 획득할 수 있는지 구하려고 한다.

세정이의 게임 스코어를 구해 출력해보자.

 

입력


첫 번째 줄에는 장애물의 개수 𝑁이 주어진다. (1 ≤ 𝑁 ≤ 250 000)

두 번째 줄에는 상단 장애물의 위치 𝐴𝑖가 공백으로 구분되어 주어진다. (−109 ≤ 𝐴𝑖 ≤ 109)

세 번째 줄에는 하단 장애물의 위치 𝐵𝑖가 공백으로 구분되어 주어진다. (−109 ≤ 𝐵𝑖 ≤ 109) (이때, 주어지는 입력은 𝐵𝑖 ≤ 𝐴𝑖임이 보장된다.)

네 번째 줄에는 플레이할 플래피 버드의 개수 𝑄가 주어진다. (1 ≤ 𝑄 ≤ 250,000)

다섯 번째 줄에는 각 플래피 버드의 크기 𝑤𝑖가 주어진다. (1 ≤ 𝑤𝑖 ≤ 109)

 

출력


각 플래피 버드별로 세정이가 얻을 수 있는 최대 게임 스코어를 각 줄마다 하나씩 출력한다.

 

문제 풀이


정렬을 이용한 문제.

새들의 크기를 기준으로 내림차순 정렬을 하면 i번째 새는 그 이전의 새들보다 크기가 같거나 작으므로 이전과 같은 점수이거나 더 많은 점수를 획득할 수 있다. 이를 이용해 투포인터 방식과 같이 while문을 사용하여 right를 증가시켜 해당 새가 넘을 수 있는 최대 개수를 구한 후 점수를 개별의 배열 points에 저장해둔다.

출력은 입력받은 새의 순서대로 출력해야 하기 때문에 pair를 사용하여 인덱스까지 같이 저장하여 정렬한 후 인덱스를 가져와 points에 저장될 수 있도록 한다.

 

아래는 코드.

더보기
#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	int N, Q, B;
	int right = 0;
	cin >> N;
	long long* heights = new long long[N];
	for (int i = 0; i < N; i++)
	{
		cin >> heights[i];
	}
	for (int i = 0; i < N; i++)
	{
		cin >> B;
		heights[i] -= B;
	}
	cin >> Q;
	pair<int, int>* birds = new pair<int, int>[Q];
	int* points = new int[Q];
	for (int i = 0; i < Q; i++)
	{
		cin >> birds[i].first;
		birds[i].second = i;
		points[i] = 0;
	}
	sort(birds, birds + Q, greater<>());
	for (int i = 0; i < Q; i++)
	{
		while (right < N && heights[right] >= birds[i].first)
		{
			right++;
		}
		int index = birds[i].second;
		points[index] = right;
	}
	for (int i = 0; i < Q; i++)
	{
		cout << points[i] << "\n";
	}
	return 0;
}

 

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

[백준 1520] 내리막 길 (C++)  (0) 2024.05.16
[백준 2011] 암호코드 (C++)  (0) 2024.05.15
[백준 14247] 나무 자르기 (C++)  (0) 2024.05.13
[백준 10799] 쇠막대기 (C++)  (0) 2024.05.12
[백준 1360] 되돌리기 (C++)  (0) 2024.05.10