https://www.acmicpc.net/problem/1524
문제
> 세준이의 N명의 병사와 세비의 M명의 병사가 전쟁을한다.
> 전투중 제일 약한 병사가 죽는데 같은편에 제일 약한 병사가 있을경우 그중 임의로 한명이 죽는다.
> 양쪽에 모두 있다면 세비의 제일 약한 병사가 임의로 죽는다.
> 최후의 병사가 남았을때의 승자를 구해라.
접근
각 병사들의 힘의 최소값을 구해서 서로 비교한 후
약한쪽의 병사를 죽인다. 만약 최소값이 같다면 세비쪽을 하나 죽인다. 이를 한명이 남을때 까지 반복하고 남은 값을 가진 쪽의 이름을 출력한다.
문제 해결
> 입력받은 T만큼 while문을 돌린다.
> 세준 병사와 세비 병사를 N, M만큼 입력받는다.
> 오름차순으로 병사들의 전투력을 정렬한다.
> 전투력 순으로 정렬 되어있으므로 맨 앞(가장 약한)부터 서로 비교한다.
> 전투력이 세준이가 크거나 같다면 세비 맨 앞 병사를 지우고, 작다면 세준 맨 앞 병사를 지운다.
> 병사가 비어있는지 판별 후 승패를 가린다.
코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T, N, M;
cin >> T;
while (T--)
{
cin >> N >> M;
vector<int> SJ(N);
vector<int> SB(M);
for (int i = 0; i < N; i++)
cin >> SJ[i];
for (int i = 0; i < M; i++)
cin >> SB[i];
sort(SJ.begin(), SJ.end());
sort(SB.begin(), SB.end());
while (!SJ.empty() && !SB.empty())
{
if (SJ[0] >= SB[0])
SB.erase(SB.begin());
else
SJ.erase(SJ.begin());
}
if (!SJ.empty())
cout << "S" << '\n';
else
cout << "B" << '\n';
}
return 0;
}

후기
전투력이 낮은 병사를 찾는 부분을 구현할 때
전부 돌면서 찾지 않고 정렬 후 전투 시키면 되는걸 알았다. 훨씬 줄어 들었다.