백준 2615번 - 오목

박진형·2021년 7월 29일
0

algorithm

목록 보기
50/111

문제 풀이

오른쪽, 아래, 오른쪽 위 대각선, 오른쪽 아래 대각선에 대한 오목 여부를 체크하는 함수를 만든다
육목일 경우에는 승리에서 제외하기위해 처음(cnt == 1)일 경우에 반대편 즉, 오른쪽일 경우 왼쪽편에, 아래쪽일 경우 위쪽편에 같은 색깔의 돌이 있는지 확인해서 존재한다면 그 경우는 스킵한다. 어차피 반대편에서 언젠가는 체크를 해 줄 것이기 때문

cnt==5 일 경우에도 뒤쪽에 육목이 나타나는 경우를 대비해서 육목이 나온다면 false를 반환한다.

문제 링크

boj/2615

소스코드

PS/2615.java

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

public class Main {
  static int[][] arr = new int[20][20];
  public static void main(String[] args) throws IOException {

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


      for(int i=0;i<19;i++)
      {
          StringTokenizer st = new StringTokenizer(br.readLine());
          for(int j=0;j<19;j++)
              arr[i][j] = Integer.parseInt(st.nextToken());
      }
   for(int i=0;i<19;i++)
      {
          for(int j=0;j<19;j++)
          {
              if(arr[i][j] ==0 )
                  continue;
              if(func1(j,i,1,arr[i][j]) || func2(j,i,1,arr[i][j]) || func3(j,i,1,arr[i][j]) ||func4(j,i,1,arr[i][j]))
              {

                  bw.write(Integer.toString(arr[i][j]) +"\n" +  Integer.toString(i+1) +" " + Integer.toString(j+1));
                  bw.flush();
                  return;
              }
          }
      }

      bw.write(Integer.toString(0));
      bw.flush();
  }
  public static boolean func1(int x, int y,int cnt,int color)
  {
      boolean ret =false;
      if(cnt == 5) {
          if(x +1 <=18 &&arr[y][x+1]==color)
              return false;
          return true;
      }
      if(cnt== 1 &&x -1 >=0 &&arr[y][x-1]==color)
          return false;
      if(x +1 <=18 &&arr[y][x+1]==color)
          ret = func1(x+1,y,cnt+1,color);
      return ret;
  }
  public static boolean func2(int x, int y,int cnt,int color)
  {
      boolean ret =false;
      if(cnt == 5) {
          if(y+1 <=18 &&arr[y+1][x]==color)
              return false;
          return true;
      }
      if(cnt== 1 &&y-1 >=0 &&arr[y-1][x]==color)
          return false;
      if(y+1 <=18 &&arr[y+1][x]==color)
          ret = func2(x,y+1,cnt+1,color);
      return ret;
  }
  public static boolean func3(int x, int y,int cnt,int color)
  {
      boolean ret =false;
      if(cnt == 5) {
          if((x + 1<=18) && (y+1 <=18) &&(arr[y+1][x+1]==color))
              return false;
          return true;
      }
      if(cnt== 1 &&(x -1>=0) && (y-1 >=0) &&(arr[y-1][x-1]==color))
          return false;
      if((x + 1<=18) && (y+1 <=18) &&(arr[y+1][x+1]==color))
          ret = func3(x+1,y+1,cnt+1,color);
      return ret;
  }
  public static boolean func4(int x, int y,int cnt,int color)
  {
      boolean ret =false;
      if(cnt == 5) {

          if(x + 1 <= 18 && y-1 >=0 &&arr[y-1][x+1]==color)
              return false;
          return true;
      }
      if(cnt== 1 &&x-1 >=0 && y+1 <=18 && arr[y+1][x-1]==color)
          return false;
      if(x + 1 <= 18 && y-1 >=0 &&arr[y-1][x+1]==color)
          ret = func4(x+1,y-1,cnt+1,color);
      return ret;
  }


}

0개의 댓글