(C++) 백준 1524번 - 세준세비

코딩너구리·2025년 9월 30일

코딩 문제 풀이

목록 보기
8/266

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;
}

후기

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

0개의 댓글