[알고리즘]/알고리즘

[알고리즘] 백준 8896번 : 가위 바위 보 (실버3)

쿠릉쿠릉 쾅쾅 2022. 4. 13. 16:27
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