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

 

이번에 볼 문제는 백준 17251번 문제인 힘 겨루기이다.
문제는 아래 링크를 확인하자.

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

 

k가 뽑혔을 때 홍팀과 청팀 중 어느 팀이 이기는지(또는 비기는지) 여부는 1번부터 k번까지의 참가자 중 가장 센 사람과 k+1번부터 N번까지의 참가자 중 가장 센 사람의 세기를 비교해 구할 수 있다.

 

k값에 대해 위의 비교를 모두 하는 것은 1번부터 k번까지의 참가자 중 가장 센 사람의 세기를 모든 k에 대해 O(N)에 먼저 따로 구해두고, 비슷하게 N번부터 k+1번까지의 참가자들 중 가장 센 사람의 세기를 모든 k에 대해 O(N)에 구해둔다면 총 O(N)에 구해낼 수 있다.

 

각각의 k가 뽑힐 확률이 동일하므로 각 k값에 대하여 승리하는 경우의 수가 어느 팀이 더 많은지를 위의 방법으로 찾아 문제를 해결하자.

 

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

#include <iostream>
using namespace std;

int N;
int A[1000002];
int L[1000002], R[1000002];
int cntL, cntR;

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

	cin >> N;
	for (int i = 1; i <= N; i++) cin >> A[i];
	for (int i = 1; i <= N; i++) L[i] = max(L[i - 1], A[i]);
	for (int i = N; i > 0; i--) R[i] = max(R[i + 1], A[i]);
	for (int i = 1; i < N; i++) {
		if (L[i] > R[i + 1]) cntL++;
		else if (L[i] < R[i + 1]) cntR++;
	}

	if (cntL > cntR) cout << 'R';
	else if (cntL < cntR) cout << 'B';
	else cout << 'X';
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 19592 // C++] 장난감 경주  (0) 2024.05.14
[BOJ 20116 // C++] 상자의 균형  (0) 2024.05.13
[BOJ 3944 // C++] 나머지 계산  (0) 2024.05.11
[BOJ 16400 // C++] 소수 화폐  (0) 2024.05.10
[BOJ 19949 // C++] 영재의 시험  (0) 2024.05.09

+ Recent posts