문제풀이/백준oj

[백준OJ] 22993번 서든어택 3

Hyeon-Uk 2021. 9. 1. 22:38
반응형

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

 

22993번: 서든어택 3

좋은 전투 순서가 존재해서 준원이만 생존하고 나머지 플레이어가 모두 죽게 만들 수 있다면 Yes를, 반대로 전투가 어떤 순서로 이루어져도 준원이가 절대 최후의 생존자가 될 수 없다면 No를

www.acmicpc.net


 

풀이

준원이에게 가장 좋은 순서가 되기위해선, 공격력이 가장 작은 플레이어부터 차례대로 와가지고, 준원이에게 흡수되는것이 가장 좋은 순서이다.

따라서 준원이를 제외한 다른 플레이어들을 오름차순 정렬을 한 뒤, 앞에서부터 비교해가며

1. 준원이보다 공격력이 작다면 준원이에게 흡수, 마지막 플레이어까지 흡수했다면 True

2. 준원이보다 크거나 같다면 False

를 리턴해주면된다.

 

시간복잡도

정렬은 C++ algorithm의 Sort를 사용했으므로 O(NlogN)이 걸린다.

탐색은 O(N)이 되므로, 총 O(NlogN)이 된다.

 

코드

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

int n;
long long jun;
vector<int> v;

void input() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		//준원이 공격력 입력
		if (i == 0) {
			cin >> jun;
		}
		//나머지 공격력 입력
		else {
			int data;
			cin >> data;
			v.push_back(data);
		}
	}
}

bool alive() {
	sort(v.begin(), v.end());
	for (int i = 0; i < v.size();i++) {
		int enemy = v[i];
		if (jun <= enemy) {
			return false;
		}
		else{
			jun += enemy;
		}

	}

	return true;
}

void solve() {
	input();
	if (alive()) {
		cout << "Yes\n";
	}
	else {
		cout << "No\n";
	}
}

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

	solve();
	return 0;
}
반응형