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