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; } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 16571 알파 틱택토 - 백트래킹 + 게임이론 JAVA (0) | 2023.09.24 |
---|---|
[백준] 13459 구슬탈출 - 구현 + BFS + 시뮬레이션 JAVA (0) | 2023.09.24 |
[백준] 2023 신기한 소수 - 브루트포스 + 소수 판정 JAVA (0) | 2023.09.22 |
[백준] 1038 감소하는 수 - 브루트포스 + 백트래킹 JAVA (0) | 2023.09.21 |
[백준] 19942 다이어트 - 브루트포스(BruteForce) + 백트래킹(BackTracking) JAVA (0) | 2023.09.20 |