※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 26944번 문제인 Uppställning이다.
문제는 아래 링크를 확인하자.

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

 

26944번: Uppställning

En grupp med n barn, låt oss kalla dem A, B, C och så vidare, beslutar sig för att testa din tankeförmåga. Utan att du ser dem ställer de upp sig på en rad. Sen räknar vart och en av dem hur många av de barn som står till vänster som är längre

www.acmicpc.net

키가 가장 큰 아이 i명만을 남겼을 때의 배치의 순서를 알고 있다면 i+1번째로 키가 큰 아이의 왼쪽에 자신보다 키가 큰 사람이 몇 명 있는지를 이용해 키가 가장 큰 i+1명만을 남겼을 때의 배치의 순서를 구할 수 있다.

 

위의 관찰을 이용해 키가 가장 큰 아이부터 한명씩 배치해나가면서 문제를 해결하자. 아이의 수가 충분히 작으므로 벡터의 insert 등을 이용해 구현해도 문제를 충분히 해결할 수 있다.

 

별해로, 아이들이 줄을 서는 모든 순열의 경우의 수를 살펴 문제의 답을 구하는 방법 또한 존재한다.

 

아래는 제출한 소스코드이다.

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

int N;
priority_queue<pair<pair<int, char>, int>> pq;
vector<char> ans;

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

	cin >> N;
	for (int i = 0; i < N; i++) {
		int L, R; cin >> L >> R;
		pq.push(make_pair(make_pair(-(L + R), 'A' + i), L));
	}

	while (!pq.empty()) {
		auto p = pq.top(); pq.pop();
		ans.insert(ans.begin() + p.second, p.first.second);
	}

	for (auto& c : ans) cout << c;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24184 // C++] Arabiska  (0) 2023.01.11
[BOJ 26948 // C++] Plankan  (0) 2023.01.11
[BOJ 26942 // C++] Gruppindelning  (1) 2023.01.11
[BOJ 6600 // C++] 원의 둘레  (0) 2023.01.10
[BOJ 25558 // C++] 내비게이션  (0) 2023.01.10

+ Recent posts