[BOJ] 1524. 세준세비
https://www.acmicpc.net/problem/1524
문제
세준이와 세비는 온라인 게임을 즐겨한다. 이 온라인 게임에서는 군대를 서로 키울 수 있다. 세준이는 N명의 병사를 키웠고, 세비는 M명의 병사를 키웠다.
이제 서로 전쟁을 하려고 한다.
전쟁은 여러 번의 전투로 이루어진다. 각 전투에서 살아있는 병사중 제일 약한 병사가 죽는다. 만약 제일 약한 병사가 여러 명이고, 제일 약한 병사가 모두 같은 편에 있다면, 그 중에 한 명이 임의로 선택되어 죽는다. 하지만, 제일 약한 병사가 여러 명이고, 양 편에 모두 있다면, 세비의 제일 약한 병사 중 한 명이 임의로 선택되어 죽는다.
전쟁은 한 명의 병사를 제외하고 모두 죽었을 때 끝난다. 전쟁의 승자를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 100보다 작거나 같다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 첫째 줄에 N과 M이 들어오고, 둘째 줄에는 세준이의 병사들의 힘이 들어오고, 셋째 줄에는 세비의 병사들의 힘이 들어온다. 힘은 정수이고, 이 값이 클수록 강하고, 작을수록 약하다.
각 테스트 케이스는 줄 바꿈으로 구분되어 있다.
출력
각 테스트 케이스에 대해서 한 줄에 하나씩 차례대로 승자를 출력한다. 세준이가 이기면 S를 세비가 이기면 B를 둘다 아닐 경우에는 C를 출력한다.
제한
- 1 ≤ N, M ≤ 1,000,000
- 병사들의 힘은 300,000,000보다 작거나 같은 자연수이다.
예제 입력
2
1 1
1
1
3 2
1 3 2
5 5
예제 출력
S
B
코드
👩💻 풀이과정
- 결국 마지막 한 명의 병사를 가진 사람이 이김 -> 가장 큰 값만 비교
- 처음 테스트 케이스 개수를
T
로 입력받음 T
만큼 케이스 반복- 각 케이스마다 한 줄을 비우고 입력되기 때문에 빈 줄을 저장할
L
정의 - 세준의 병사 수
N
과 세비의 병사 수M
입력 -
가장 큰 병사를 저장할 변수
Smax
,Bmax
정의 - 세준과 세비 각각에 대해 가장 큰 값을 가진 병사 -> max 변수에 저장
Smax
와Bmax
비교하여 더 큰 값을 가진 사람을 출력하고, 같으면 세준 출력
- 각 케이스마다 한 줄을 비우고 입력되기 때문에 빈 줄을 저장할
👀 주의할 점
- 병사 하나하나 비교하는 것이 아닌, 마지막 한 명에 주목!
- BufferedReader
- 버퍼를 이용해 읽는 함수 -> 입출력 효율이 아주 좋음
- 버퍼에 한번에 모아서 HDD로 보내기 때문
\n
만 경계로 인식하고, 입력받은 데이터를String
으로 고정하기 때문에 데이터 가공 필요- 많은 데이터를 입력받아야 할 때 이용!
br.readLine()
으로 입력 받음- 예외처리 필수!!
- 함수에
throws IOException
try {} catch (IOException e) {}
- 함수에
- 버퍼를 이용해 읽는 함수 -> 입출력 효율이 아주 좋음
- StringTokenizer
- 문자열을 지정한 구분자로 쪼개주는 클래스 -> token
- default 구분자:
\t
,\n
,\r
StringTokenizer(str, delim);
으로 구분자 지정 가능st.nextToken()
으로 다음 토큰 반환st.hasMoreTokens()
: 남아있는 토큰이 있는지st.countTokens()
: 총 토큰 개수 반환