728x90
문제
https://www.acmicpc.net/problem/8896
📌 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int T = Integer.parseInt(br.readLine()); // 테스트 케이스 수
while(T --> 0) {
solution();
}
}
static void solution() throws IOException {
String[] arr; // 가위바위보 담을 배열
int N = Integer.parseInt(br.readLine()); // 사람 수
arr = new String[N]; // 사람 수 만큼 배열 크기 세팅
// 사람당 가위바위보 패 입력값 받기
for(int i=0; i<N; i++) {
arr[i] = br.readLine();
}
// 가위바위보를 총 몇 판하는지 k값에 입력
int k = arr[0].length();
// 패배자의 인덱스값을 담을 리스트
List<Integer> loser = new ArrayList<>();
iLoop:
for(int i=0; i<k; i++) { // i는 몇 번째 판인지 의미 (문자열의 index값)
// 승자가 없는 경우 (패배자 리스트가 전체 인원과 같으면 승자가 없다.)
if(loser.size()==N) {
System.out.println(0);
return;
}
/**
* 무승부 체크 처리
*/
boolean checkP = false;
boolean checkS = false;
boolean checkR = false;
for(int m=0; m<N; m++) { // 사람 수
if(arr[m].charAt(i)==' ') continue; // 공백이면 패배자이므로 pass
if(arr[m].charAt(i)=='P') { // P가 존재할 경우
checkP = true;
}
if(arr[m].charAt(i)=='S') { // S가 존재할 경우
checkS = true;
}
if(arr[m].charAt(i)=='R') { // R이 존재할 경우
checkR = true;
}
// P,S,R 모두 존재하는 경우 무승부 처리하고 다음 판으로 넘긴다.
if(checkP && checkS && checkR) {
continue iLoop;
}
}
// S만 존재하는 경우 무승부 처리하고 다음 판으로 넘긴다.
if(!checkP && checkS && !checkR) {
continue;
}
// R만 존재하는 경우 무승부 처리하고 다음 판으로 넘긴다.
if(!checkP && !checkS && checkR) {
continue;
}
// P만 존재하는 경우 무승부 처리하고 다음 판으로 넘긴다.
if(checkP && !checkS && !checkR) {
continue;
}
/**
* 무승부가 아닐 경우
*/
// P와 R만 존재하는 경우 (P가 이긴다.)
if(checkP && !checkS && checkR) {
for(int j=0; j<N; j++) { // N은 사람의 수 의미
if(arr[j].charAt(i)==' ') continue; // 공백이면 패배자이므로 pass
if(arr[j].charAt(i)=='R') { // 패배자 판별
arr[j] = arr[j].replaceAll(".", " "); // 패배자는 공백 처리
loser.add(j+1); // 사람 index는 1부터 시작하므로 j+1로 패배자 인덱스 값 대입
continue;
}
}
continue iLoop;
}
// P와 S만 존재하는 경우 (S가 이긴다.)
if(checkP && checkS && !checkR) {
for(int j=0; j<N; j++) {
if(arr[j].charAt(i)==' ') continue;
if(arr[j].charAt(i)=='P') { // 패배자
arr[j] = arr[j].replaceAll(".", " ");
loser.add(j+1);
continue;
}
}
continue iLoop;
}
// S와 R만 존재하는 경우 (R이 이긴다.)
if(!checkP && checkS && checkR) {
for(int j=0; j<N; j++) {
if(arr[j].charAt(i)==' ') continue;
if(arr[j].charAt(i)=='S') { // 패배자
arr[j] = arr[j].replaceAll(".", " ");
loser.add(j+1);
continue;
}
}
continue iLoop;
}
} // end of iLoop
// 패배자 리스트의 사람 수
int loserSize = loser.size();
// 승자가 없는 경우 (최후의 1인이 없을 경우 승자가 없다.)
if(loserSize!=N-1) {
System.out.println(0);
return;
}
/**
* 최후의 승자 1인이 있을 경우
*/
// 패배자 리스트를 오름차순으로 정렬
Collections.sort(loser);
// 마지막번째 사람이 승자가 아닐 경우
for(int i=1; i<=N-1; i++) {
if(i!=loser.get(i-1)) {
System.out.println(i);
return;
}
}
// 마지막번째 사람이 승자
System.out.println(N);
}
}
728x90
'[알고리즘] > 알고리즘' 카테고리의 다른 글
[알고리즘] 백준 1644번 : 소수의 연속합 (0) | 2022.04.14 |
---|---|
[알고리즘] 백준 2003번 : 수들의 합2 (실버3) (0) | 2022.04.14 |
백준 10820번 : 문자열 분석 (브론즈2) (0) | 2022.04.12 |
백준 1718번 : 암호 (브론즈2) (0) | 2022.04.12 |
[알고리즘] 백준 1003번 : 피보나치 함수 (0) | 2022.04.12 |