반응형

 

[광고 누르면 오늘의 행운 상승!!]

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

 

7682번: 틱택토

문제 틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를

www.acmicpc.net

빡구현 문제

1. 참고사항

여러가지 까다로운 조건들이 있다. 전부 걸러주어야 한다.

2. 구현

- 가로, 세로, 대각선 검사를 통해 빙고 수를 알아낸다.
- 같은 라인 빙고가 여러개면 x 
- X의 갯수가 O와 같으면 O가 이겨야 한다
- X가 더 크면 X가 이겨야 한다.
- 빙고가 하나도 없는 경우 X

package Study6;

import java.io.*;
import java.util.*;

public class 틱택토 {

	static char[][] map;
	static boolean[][] visit;
	static int N,ans;
	static char[] ch;
	static int XrowBingo, XcolBingo;
	static int OrowBingo, OcolBingo;
	static int OCrossBingo , XCrossBingo;
	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("test.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		while(true) {
			String s = br.readLine();
			if(s.equals("end")) break;
			
			ch = s.toCharArray();
			XrowBingo = 0;
			XcolBingo = 0;
			OrowBingo = 0;
			OcolBingo = 0;
			OCrossBingo = 0;
			XCrossBingo = 0;
			
			map = new char[3][3];
			int idx = 0;
			int X = 0;
			int O = 0;
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					map[i][j] = ch[idx++];
					if(map[i][j] == 'X') X++;
					else if(map[i][j] == 'O') O++;
				}
			}
			
			if(Math.abs(X - O) > 1 || O > X) {
				System.out.println("invalid");
				continue;
			}

			//가로, 세로 검사
			for (int i = 0; i < 3; i++) {
				int rowX = 0;
				int rowO = 0;
				int colX = 0;
				int colO = 0;
				
				for (int j = 0; j < 3; j++) {
					if	   (map[i][j] == 'X') rowX++;
					else if(map[i][j] == 'O') rowO++;
					
					if	   (map[j][i] == 'X') colX++;
					else if(map[j][i] == 'O') colO++;
					
					if(rowO == 3) {
						OrowBingo++;
					}else if(rowX == 3) {
						XrowBingo++;
					}else if(colX == 3) {
						XcolBingo++;
					}else if(colO == 3) {
						OcolBingo++;
					}
				}
			}
			
			int crossX=0;
			int crossO=0;
			//대각선 검사
			for (int i = 0; i < 3; i++) {
				if	   (map[i][i] == 'X') crossX++;
				else if(map[i][i] == 'O') crossO++;
				
				if(crossO == 3) OCrossBingo++;
				if(crossX == 3) XCrossBingo++;
				
			}
			crossX=0;
			crossO=0;
			
			int temp= 0;
			for (int i = 2; i >= 0; i--) {
				if	   (map[i][temp] == 'X') crossX++;
				else if(map[i][temp] == 'O') crossO++;
				temp++;
				if(crossO == 3) OCrossBingo++;
				if(crossX == 3) XCrossBingo++;
			}
			
			//같은 라인 빙고가 여러개인 경우 (cross제외)
			if(XrowBingo > 1 || XcolBingo > 1 || OrowBingo > 1 || OcolBingo>1) {
				System.out.println("invalid");
				continue;
			}
			
		
			//X와 O가 같으면 O가 이겨야한다
			if(X == O) {
				if((XrowBingo > 0 || XcolBingo > 0 || XCrossBingo > 0) ) {
					System.out.println("invalid");
					continue;
				}
			}else if(X > O) {
				//X가 더 크면 X가 이겨야 한다
				if(OrowBingo > 0 || OcolBingo > 0 || OCrossBingo > 0) {
					System.out.println("invalid");
					continue;
				}
			}

			//x와 o의 합이 9인 경우
			if(X+O == 9) {
				System.out.println("valid");
				continue;
			}
			
			//빙고가 하나도 없는 경우
			if(XrowBingo + XcolBingo + OrowBingo + OcolBingo + OCrossBingo + XCrossBingo == 0) {
				System.out.println("invalid");
				continue;
			}
		
			System.out.println("valid");
		}
	}
}
반응형

+ Recent posts