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

[백준 28449] 누가 이길까 (C++)

by fortissimo 2024. 12. 15.

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

문제


HI-ARC는 종강을 맞아 HI팀과 ARC팀으로 나누어 친선대회를 열려고 한다. HI팀엔 N명 ARC팀엔 M명이 속해있다. 대회는 다른 팀끼리 모든 사람들끼리 한번씩 대결을 하는 것으로, 대회는 N×M개의 대결로 이루어진다. 모든 참가자는 코딩실력을 가지고 있다. 대결을 하면 더 높은 코딩실력을 가진 참가자가 승리하고, 두 참가자의 코딩실력이 같다면 무승부가 된다.

하얔이는 이 대회의 결과를 빨리 알고싶어졌다. 하얔이를 위해 대회의 결과를 예측해보자!

 

입력


첫째 줄에 HI팀의 인원 수 N, ARC팀의 인원 수 M이 공백으로 구분되어 정수로 주어진다. (1 ≤ N,M ≤ 100000)

둘째 줄에 HI팀의 참가자의 코딩실력을 나타내는 길이 N 수열 a가 공백으로 구분되어 정수로 주어진다. (1 ≤ ai ≤ 100000)

셋째 줄에 ARC팀의 참가자의 코딩실력을 나타내는 길이 M 수열 b가 공백으로 구분되어 정수로 주어진다. (1≤bi≤100000)

 

출력


첫째 줄에 HI팀 참가자의 승리 횟수, ARC팀 참가자의 승리 횟수, 무승부 횟수를 공백으로 구분하여 출력한다.

 

문제 풀이


이분 탐색 문제.

 

한 사람당 다른 팀 참가자와 모두 한번씩 대결하므로, 한 사람이 이긴 횟수와 무승부 횟수를 구하면 자동적으로 상대팀의 이긴 횟수를 구할 수 있다. lower_bound()와 upper_bound()를 이용하면 같은 숫자의 개수(=무승부 횟수), 이긴 횟수를 구할 수 있으므로 정렬 후 해당 함수를 사용하면 된다.

 

아래는 코드.

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

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

	int N, M;
	cin >> N >> M;
	int* HI = new int[N];
	int* ARC = new int[M];
	long long HIWin = 0;
	long long ARCWin = 0;
	long long draw = 0;
	for (int i = 0; i < N; i++)
	{
		cin >> HI[i];
	}
	sort(HI, HI + N);
	for (int j = 0; j < M; j++)
	{
		cin >> ARC[j];
	}
	sort(ARC, ARC + M);
	for (int i = 0; i < N; i++)
	{
		int upper = upper_bound(ARC, ARC + M, HI[i]) - ARC;
		int lower = lower_bound(ARC, ARC + M, HI[i]) - ARC;
		HIWin += lower;
		draw += upper - lower;
		ARCWin += M - upper;
	}
	cout << HIWin << " " << ARCWin << " " << draw << "\n";
	return 0;
}

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

[백준 15723] n단 논법 (C++)  (0) 2024.12.18
[백준 17503] 맥주 축제 (C++)  (1) 2024.12.16
[백준 27277] 장기자랑 (C++)  (0) 2024.12.14
[백준 9328] 열쇠 (C++)  (2) 2024.12.13
[백준 10872] 팩토리얼 (C++)  (0) 2024.12.12