programmers_혼자서 하는 틱택토_java

2023. 5. 24. 17:45Algorithm/Programmers

728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

실패 조건 : 

1. O의 갯수 < X의 갯수

2. O의 갯수 - X의 갯수 > 1

3. 둘다 승리

4. O 승리 -> O의 갯수 != X의 갯수 +1

5. X 승리 -> X의 갯수 != O의 갯수

 

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

        answer = game(board);

        return answer;
    }

    public int game(String[] board){
        int oCount = 0;
        int xCount = 0;
        int oRes = 0;
        int xRes = 0;

        for (String s : board){
            int sLength = s.length();
            for (int i = 0; i<sLength; i++){
                if (s.charAt(i) == 'O'){
                    oCount++;
                }else if (s.charAt(i) == 'X'){
                    xCount++;
                }
            }
        }

        // 후공이 더 많은 경우
        if (oCount < xCount){
            return 0;
        }
        // 비정상적인 차이를 보이는 경우
        if (oCount - xCount > 1){
            return 0;
        }
        // 한줄 완성한 경우
        if (oCount >= 3){
            oRes = isWin(board, 'O');
        }
        if (xCount >= 3){
            xRes = isWin(board, 'X');
        }
        // o승리 -> oCount가 1개 더 많아야함
        if (oRes >= 1 && oCount != xCount + 1){
            return 0;
        }
        // x 승리 -> xCount == oCount
        if (xRes >= 1 && oCount != xCount){
            return 0;
        }
        // 둘다 승리인 경우
        if (xRes >= 1 && oRes >= 1){
            return 0;
        }
        return 1;
    }

    // 성공한 것 있는지 확인
    public int isWin(String[] board, char pattern){
        int winCount = 0;
        boolean flag = true;

        //가로 확인
        for (int i = 0; i<3; i++){
            flag = true;
            for (int j = 0; j<3; j++){
                if (board[i].charAt(j) != pattern){
                    flag = false;
                    break;
                }
            }
            if (flag){
                winCount++;
            }
        }

        // 세로 확인
        for (int j = 0; j<3; j++){
            flag = true;
            for (int i = 0; i<3; i++){
                if (board[i].charAt(j) != pattern){
                    flag = false;
                    break;
                }
            }
            if (flag){
                winCount++;
            }
        }

        // 대각 확인
        flag = true;
        for (int i = 0; i<3; i++){
            if (board[i].charAt(i) != pattern){
                flag = false;
                break;
            }
        }
        if (flag){
            winCount++;
        }

        flag = true;
        int tmp = 0;
        for (int i = 2; i>=0; i--){
            if (board[tmp++].charAt(i) != pattern){
                flag = false;
                break;
            }
        }
        if (flag){
            winCount++;
        }
        return winCount;
    }
}