https://www.acmicpc.net/problem/7682

 

7682번: 틱택토

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입

www.acmicpc.net

코드설명

구현 문제입니다.

 

일반적으로 구현 문제같은경우, 문제에서 어떤것을 구현해야할지 알려주지만 이 문제같은경우 주어진 사항으로 유추하면서 진행해야합니다.

 

관련 내용은 주석코드에 자세하게 남겨놓았습니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
	
	public static int N;
	public static StringBuilder sb = new StringBuilder();
	public static char[][] map;
	public static String str;
	public static int xCnt = 0, oCnt = 0;
	public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//    	StringTokenizer st = new StringTokenizer(br.readLine());
    	
    	while(true) {
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		str = st.nextToken();
    		if(str.equals("end")) break;
    		xCnt = 0;
    		oCnt = 0;
    		map = new char[3][3];
    		int mapIdx = 0;
    		for(int i=0;i<3;i++) {
    			for(int j=0;j<3;j++) {
    				map[i][j] = str.charAt(mapIdx++);
    				if(map[i][j] =='X') xCnt += 1;
    				if(map[i][j] =='O') oCnt += 1;
    			}
    		}
    		
    		if(xCnt == oCnt +1 || xCnt == oCnt) { //xCnt가 oCnt보다 1개 많거나, xCnt가 oCnt와 같은경우에만 valid 여부를 검사합니다. 아닐경우, 무조건 invalid 입니다.
    		
	    		//게임판이 꽉 채워진경우, X가 먼저 두므로 X가 한개 많아야합니다.
	    		if(xCnt + oCnt == 9) { //게임판이 꽉 채워진경우
	    			if(xCnt == oCnt + 1) { //게임판이 꽉 채워진경우, X의 개수가 O의 개수보다 한개 많아야하는 조건이 있습니다.

	    				if(gameEndCheck('X') == true && gameEndCheck('O') == true) { //O와 X 둘다 빙고라면, invalid 합니다. 만약 1개라도 이미 연속인것이 나왔다면 바로 종료되어야 하기 떄문
	    					sb.append("invalid").append("\n");	
	    				}
	    				else if(gameEndCheck('X') == false && gameEndCheck('O') == true) { //map이 모두 찼을떄, X와 O가 순서대로 놓이기에 9번쨰로 X가 마지막으로 놓입니다. 그렇기에 꽉 차있을떄 O가 빙고를 만들 수 없습니다. O가 빙고라면 이 전에 빙고가 완성되었어야 합니다.
	    					sb.append("invalid").append("\n");
	    				}
	    				else { //그 이외에는 모두 valid합니다.
	    					sb.append("valid").append("\n");
	    				}
	    			}
	    			else { //map이 9개로 모두 차있을때 X의 개수가 O보다 1개 더 많지않은경우 무조건 'invalid'입니다.
	    				sb.append("invalid").append("\n");
	    			}
	    		}
	    		else { //게임판이 꽉 채워지지 않은경우, 무조건 한개의 빙고만 존재해야합니다.
	    			if(gameEndCheck('X') == true && gameEndCheck('O') == true ) { //만약 2개 모두 빙고라면 실패입니다.
	    				sb.append("invalid").append("\n");
	    			}
	    			else if(gameEndCheck('X') == false && gameEndCheck('O') == false) { //만약 두개 다 빙고가 아니라면 종료조건이 없으므로 실패입니다.
						sb.append("invalid").append("\n");
					}
	    			else if(gameEndCheck('X') == false && gameEndCheck('O') == true && xCnt != oCnt) { //만약 O가 빙고인데, O의 개수와 X의 개수가 다르면 실패입니다.(O가 짝수번쨰에 놓이기 떄문)
	    				sb.append("invalid").append("\n");
	    			}
	    			else if(gameEndCheck('X') == true && gameEndCheck('O') == false && xCnt != oCnt + 1) { //만약 X가 빙고이면 X의 개수가 O보다 1개 많지 않다면 실패입니다. (X가 홀수번쨰에 놓이기 떄문)
	    				sb.append("invalid").append("\n");
	    			}
	    			else { //그 이외는 모두 valid 합니다.
						sb.append("valid").append("\n");
					}
	    		}
	    		
    		}
    		else {
    			sb.append("invalid").append("\n");
    		}
    		
    	}
    	System.out.println(sb.toString());
    }
	public static boolean gameEndCheck(char standards) {
		boolean check = false;
		
		//가로로 3줄 검사
		//가로로 standards가 3개 연속이상인지 확인합니다.
		for(int i=0;i<3;i++) { //3개의 행을 검사합니다.
			check = true; //일단 성공으로 처리합니다.
			for(int j=0; j<3;j++) {
				if(map[i][j] != standards) { 
					check = false;
				}
			}
			if(check == true) { //만약 한번이라도 성공한다면 성공이므로 바로 종료시킵니다.
				return true;
			}
		}
		
		//세로로 3줄 검사
		for(int j=0; j<3; j++) { //3개의 열을 검사합니다.
			check = true; //일단 성공으로 처리합니다.
			for(int i=0; i<3; i++) {
				if(map[i][j] != standards) {
					check = false;
				}
			}
			if(check == true) {
				return true;
			}
		}
		
		//대각선 검사.
		if(map[0][0] == standards && map[1][1] == standards && map[2][2] == standards) {
			return true;
		}
		if(map[0][2] == standards && map[1][1] == standards && map[2][0] == standards) {
			return true;
		}
		
		return false;
	}
	
}

 

+ Recent posts