[프로그래머스] -혼자서하는 틱택토

JIWOO YUN·2023년 8월 7일
0

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/160585

구현방법

실수를 했을수도있지만 규칙을 지켜서 진행했으면 1

못지킨 경우 0

규칙

혼자서 선공 후공 둘다

선공 O

후공 X

가장 큰 쟁점 -> 규칙을 지켰는가?

맵크기는 3*3 고정

큰쟁점

불가능한경우

  • 전체 판이 X만 있는경우

    • 선공은 O기 때문에 불가능
  • "O"를 표시할 차례인데 "X"를 표시하거나 반대로 "X"를 표시할 차례인데 "O"를 표시한다.

    • O의 갯수와 X의 개수가 2개이상 어긋나는 경우 실수

선공이나 후공이 승리했는데 추가 진행된 경우 실수

  • 게임이 끝났는지 체크
    • O가 연속 3개인데 X도 연속 3개가 되는 경우 -> 실수
    • 전체 체크 필요.

이 경우를 체크하면될듯?

승리 조건 -> 가로 세로 대각선 중 같은 표시 3개인경우 승리

row = 0 col = 0 인경우 -> 가로 세로 대각 전부 체크

row = 1 col = 0 인경우 -> 가로 만체크

불가능 한경우 를 전부 체크해주면 되는 문제.

        //X는 있는데 O가 없는경우 -> 실수
        if (O_sum == 0 && X_sum >= 1) {
            return 0;
        }
        //X가 더 많으면 아웃
        if(X_sum > O_sum)
            return 0;

        //둘의 차이가 2이상인경우 -> 실수
        if (O_sum - X_sum >= 2) {
            return 0;
        }

        checkMap();
        //둘다 승리한경우 -> 불가능
        if (WinO && WinX) {
            return 0;
        }

        //O가 승리 했을때 둘의 개수가 같은경우 실수
        if(WinO && O_sum == X_sum)
            return 0;

        //X가 완성됬을때 O가 하나더 있는경우 -> 끝나고도 진행됬음
        if(WinX && O_sum - X_sum >= 1)
            return 0;

알고리즘

구현

CODE

class Solution {
    char map[][];

    int X_sum = 0;
    int O_sum = 0;

    boolean WinO = false;

    boolean WinX = false;

    public int solution(String[] board) {
        int answer = -1;

        map = new char[3][3];
        for (int row = 0; row < 3; row++) {

            for (int col = 0; col < 3; col++) {
                char cur = board[row].charAt(col);
                map[row][col] = cur;
                if (cur == 'X') {
                    X_sum += 1;
                } else if (cur == 'O') {
                    O_sum += 1;
                }
            }
        }

        answer = isPossible();


        return answer;
    }

    private int isPossible() {

        //X는 있는데 O가 없는경우 -> 실수
        if (O_sum == 0 && X_sum >= 1) {
            return 0;
        }
        //X가 더 많으면 아웃
        if(X_sum > O_sum)
            return 0;

        //둘의 차이가 2이상인경우 -> 실수
        if (O_sum - X_sum >= 2) {
            return 0;
        }

        checkMap();
        //둘다 승리한경우 -> 불가능
        if (WinO && WinX) {
            return 0;
        }

        if(WinO && O_sum == X_sum)
            return 0;

        //X가 완성됬을때 O가 하나더 있는경우 -> 끝나고도 진행됬음
        if(WinX && O_sum - X_sum >= 1)
            return 0;


        return 1;
    }
    //가로 3개
    //세로 3개
    //대각 2개
    private void checkMap() {
        //가로 체크
        for (int row = 0; row < 3; row++) {
            int cnt = 1;
            char cur = map[row][0];
            if (cur == '.')
                continue;
            for (int col = 1; col < 3; col++) {
                if (cur == map[row][col]) {
                    cnt += 1;
                } else {
                    break;
                }
            }
            if (cnt == 3 && cur == 'O') {
                WinO = true;
            } else if (cnt == 3 && cur == 'X') {
                WinX = true;
            }
        }

        //세로 체크
        for (int col = 0; col < 3; col++) {
            int cnt = 1;
            char cur = map[0][col];
            if(cur == '.')
                continue;
            for (int row = 1; row < 3; row++) {
                if (cur == map[row][col]) {
                    cnt += 1;
                } else {
                    break;
                }
            }
            if (cnt == 3 && cur == 'O') {
                WinO = true;
            } else if (cnt == 3 && cur == 'X') {
                WinX = true;
            }
        }

        //대각 체크 2가지
        char cur = map[0][0];
        if (cur != '.') {
            if (cur == map[1][1] && cur == map[2][2]) {
                if(cur == 'O'){
                    WinO = true;
                }else if(cur == 'X'){
                    WinX = true;
                }

            }
        }
        cur = map[0][2];
        if(cur != '.'){
            if(cur == map[1][1] && cur == map[2][0]){
                if(cur == 'O'){
                   WinO = true;
                }if(cur == 'X'){
                    WinX = true;
                }
            }
        }
    }
}
profile
열심히하자

0개의 댓글