백준 7682번 - 틱택토

박진형·2021년 7월 31일
0

algorithm

목록 보기
52/111

문제 풀이

한 줄로 입력된 문자열을 3X3으로 먼저 바꿔준다.
그리고나서 O가 이겼는지 X가 이겼는지, O는 몇개가 나왔는지 X는 몇개가 나왔는지 체크를 해준다.
O와 X는 동시에 이길수가 없다.
그리고 X가 이길 경우에는 X의 개수가 O의 개수보다 1개 많아야한다.
O가 이길 경우에는 X의 개수와 O의 개수가 같아야한다.
둘 다 이긴 경우가 아니라면 X의 개수는 5, O의 개수는 4개여야 한다.

문제 링크

boj/7682

소스코드

PS/7682.java

import java.io.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
import java.util.Vector;


public class Main {
  static Vector<Character> v = new Vector();
  static int xc,oc;
  static char g_t;
  public static void main(String[] args) throws IOException {

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


     while(true)
     {
         String s = br.readLine();
         if(s.equals("end"))
             break;
         System.out.println(checkValid(s) ? "valid" : "invalid");
     }

  }
  static boolean checkBingo1(int x,int y,int cnt ,char[][] arr,char c) {
      boolean ret = false;
      if (cnt == 2) {
          return true;
      }
      if(y+1 <=2 && arr[y+1][x] == c)
      {
          ret = checkBingo1(x,y+1,cnt+1, arr,c);
      }
      return ret;
  }


  static boolean checkBingo2(int x,int y,int cnt ,char[][] arr,char c) {
      boolean ret = false;
      if (cnt == 2) {
          return true;
      }
      if (x + 1 <= 2 && arr[y][x+1] == c) {
          ret = checkBingo2(x + 1, y, cnt + 1, arr, c);
      }
      return ret;
  }
  static boolean checkBingo3(int x,int y,int cnt ,char[][] arr,char c) {
      boolean ret = false;
      if (cnt == 2) {
          return true;
      }
      if(x+1 <=2 && y+1<=2 && arr[y+1][x+1] == c)
      {
          ret = checkBingo3(x+1,y+1,cnt+1, arr,c);
      }
      return ret;
  }
  static boolean checkBingo4(int x,int y,int cnt ,char[][] arr,char c) {
      boolean ret = false;
      if (cnt == 2) {
          return true;
      }
      if(x+1 <=2 && y-1>=0 && arr[y-1][x+1] == c)
      {
          ret = checkBingo4(x+1,y-1,cnt+1, arr,c);
      }
      return ret;
  }

  static boolean checkValid(String s)
  {
      int check_x =0,check_o=0;
     char[][] arr = new char[3][3];

      for(int i = 0 ;i<3;i++)
      {
          for(int j=0;j<3;j++) {
              arr[i][j] = s.charAt(i * 3 + j);
              if (arr[i][j] == 'X')
                  check_x++;
              if (arr[i][j] == 'O')
                  check_o++;
          }
      }
      boolean o_win =false;
      boolean x_win =false;
      for(int i=0;i<3;i++)
      {
          for(int j=0;j<3;j++)
          {
              if(arr[i][j] !='.' && checkBingo1(j,i,0,arr,arr[i][j]) || checkBingo2(j,i,0,arr,arr[i][j]) || checkBingo3(j,i,0,arr,arr[i][j])
              ||checkBingo4(j,i,0,arr,arr[i][j])) {
                  if(arr[i][j] == 'X')
                      x_win=true;
                  else if(arr[i][j] == 'O')
                      o_win = true;
              }
          }
      }
     /* System.out.println("x_win = " + x_win);
      System.out.println("o_win = " + o_win);*/
      if(o_win && x_win)
          return false;
      if(x_win && check_x- check_o == 1)
          return true;
      if(o_win && check_x == check_o)
          return true;
      if(!o_win && !x_win && check_x == 5 && check_o == 4)
          return true;
      return false;
  }
}

0개의 댓글