[C++백준 1524:세준세비]
문제링크
https://www.acmicpc.net/problem/1524
1524번: 세준세비
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 100보다 작거나 같다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 첫째 줄에 N과 M이 들어오고, 둘째 줄에는 세준이의 병사들의 힘이 들어
www.acmicpc.net
문제
세준이와 세비는 온라인 게임을 즐겨한다. 이 온라인 게임에서는 군대를 서로 키울 수 있다. 세준이는 N명의 병사를 키웠고, 세비는 M명의 병사를 키웠다.
이제 서로 전쟁을 하려고 한다.
전쟁은 여러 번의 전투로 이루어진다. 각 전투에서 살아있는 병사중 제일 약한 병사가 죽는다. 만약 제일 약한 병사가 여러 명이고, 제일 약한 병사가 모두 같은 편에 있다면, 그 중에 한 명이 임의로 선택되어 죽는다. 하지만, 제일 약한 병사가 여러 명이고, 양 편에 모두 있다면, 세비의 제일 약한 병사 중 한 명이 임의로 선택되어 죽는다.
전쟁은 한 명의 병사를 제외하고 모두 죽었을 때 끝난다. 전쟁의 승자를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 100보다 작거나 같다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 첫째 줄에 N과 M이 들어오고, 둘째 줄에는 세준이의 병사들의 힘이 들어오고, 셋째 줄에는 세비의 병사들의 힘이 들어온다. 힘은 숫자이고, 숫자가 클수록 강하고, 작을수록 약하다. N과 M은 백만보다 작거나 같은 자연수이다.
또, 각 테스트 케이스는 엔터로 구분되어 있다.(예제 참고)
출력
각 테스트 케이스에 대해서 한 줄에 하나씩 차례대로 승자를 출력한다. 세준이가 이기면 S를 세비가 이기면 B를 둘다 아닐 경우에는 C를 출력한다.
해석
세준, 세비의 병사를 벡터에 담고 sort를 진행한다.
각 벡터의 첫째 위치에는 가장 약한 병사가 담겨있고, 두 병사를 비교하여 조건에 맞게 삭제시켜준다.
병사의 수가 1명이 남을 때까지 위 과정을 반복한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m, t, s;
cin >> t;
while (t--) {
cin >> n >> m;
vector<int> sejun;
vector<int> sebi;
// 세준이의 병사
for (int i = 0; i < n; i++) {
cin >> s;
sejun.push_back(s);
}
// 세비의 병사
for (int i = 0; i < m; i++) {
cin >> s;
sebi.push_back(s);
}
// 오름차순 정렬
sort(sejun.begin(), sejun.end());
sort(sebi.begin(), sebi.end());
while (min(sejun.size(), sebi.size()) > 0) {
if (sejun[0] > sebi[0]) {
sebi.erase(sebi.begin());
}
else if (sejun[0] < sebi[0]) {
sejun.erase(sejun.begin());
}
else if (sejun[0] == sebi[0]) {
sebi.erase(sebi.begin());
}
}
if (sejun.size() > 0) {
cout << "S" << '\n';
}
else if(sebi.size() > 0) {
cout << "B" << '\n';
}
else {
cout << "C" << '\n';
}
}
}
|
cs |
Memo
.