Koala - 13기/기초 알고리즘 스터디

[BOJ/java] 16955번 오목, 이길 수 있을까 ?

msms0324 2024. 2. 24. 15:23

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

 

16955번: 오목, 이길 수 있을까?

구사과와 큐브러버는 10×10 크기의 바둑판에서 오목을 하고 있다. 턴은 구사과가 먼저 갖는다. 바둑판의 상태가 주어진다. 구사과가 턴을 한 번 더 가졌을 때, 이길 수 있는지 구하는 프로그램을

www.acmicpc.net

 

첫번째 플레이어가 돌을 뒀을때 이겼는지 판별하는 문제이다.

빈 칸에 첫번째 플레이어의 돌(X)을 두고, 가로,세로,오른쪽아래로 향하는 대각선, 왼쪽아래로 향하는 대각선 으로 나눠서

이기는 조건인 XXXXX가 존재한다면 1을 출력하면 될 것이다.

대각선을 생각하는 것이 조금 어려웠는데,

왼쪽아래로 향하는 대각선은

열기준으로 작아지는 방향, 행기준으로는 커지는 방향이다.

그런데  찾는 XXXXX의 길이는 5이니

반복문을 설정할때 줄을 시작하는 칸에서 4를 더해주거나 뺀 값이 인덱스를 안 넘어가게 설정해주면 된다.

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

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {


        String str[][]=new String[10][10];
        for(int i=0;i<10;i++){
            String strr=br.readLine();
            for(int j=0;j<10;j++){
                str[i][j]=String.valueOf(strr.charAt(j));

            }
        }









        boolean flag=false;

        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                if(str[i][j].equals(".")){
                    str[i][j]="X";


                    if(test(str)){
                        flag=true;
                        break;
                    }






                    str[i][j]=".";


                }
            }
        }


        if(flag){
            bw.write("1");
        }
        else{
            bw.write("0");
        }



        bw.flush();
        bw.close();



    }

    static boolean test(String str[][]){
        boolean flag=false;

        for(int k=0;k<6;k++){
            for(int j=0;j<10;j++){
                String newstr=str[k][j]+str[k+1][j]+str[k+2][j]+str[k+3][j]+str[k+4][j];
                if(newstr.equals("XXXXX")){
                    flag=true;

                }
            }
        }
        for(int k=0;k<10;k++){
            for(int j=0;j<6;j++){
                String newstr=str[k][j]+str[k][j+1]+str[k][j+2]+str[k][j+3]+str[k][j+4];
                if(newstr.equals("XXXXX")){
                    flag=true;
                }

            }
        }
        for(int k=0;k<6;k++){
            for(int j=9;j>=4;j--){
                String newstr=str[k][j]+str[k+1][j-1]+str[k+2][j-2]+str[k+3][j-3]+str[k+4][j-4];
                if(newstr.equals("XXXXX")){
                    flag=true;
                }

            }
        }

        for(int i=0;i<6;i++){
            for(int j=0;j<6;j++){
                String newstr=str[i][j]+str[i+1][j+1]+str[i+2][j+2]+str[i+3][j+3]+str[i+4][j+4];
                if(newstr.equals("XXXXX")){
                    flag=true;
                }
            }
        }


        return flag;

    }





}