Coding Test/프로그래머스

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

lsh2613 2023. 8. 3. 21:14

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

틱택토 조건

  1. 둘 다 이기는 경우 존재X
  2. O가 승리했을 경우 O갯수가 X갯수보다 하나 큼
  3. X가 승리했을 경우 O와 X의 갯수가 동일해야 함
  4. 아무도 승리하지 못했을 경우 o가 x랑 같거나 하나 더 큼

위 조건을 체크하기 위해 O와 X의 개수, 해당 틱택토에서 O와 X의 승리 여부를 구한다.

 

코드

class Solution {
    public int solution(String[] board) {
        int answer = -1;
        
        int o = 0;
        int x= 0;
        
        for(int i=0; i<board.length; i++){
            for(int j=0; j<board[i].length();j++){
                if(board[i].charAt(j)=='O')
                    o++;
                if(board[i].charAt(j)=='X')
                    x++;
            }
        }
        
        boolean oWin = isWin(board, 'O');
        boolean xWin = isWin(board, 'X');
        
        // 둘 다 이기는 경우 존재X
        if(oWin && xWin) answer = 0;
        
        // O가 승리했을 경우 O갯수가 X갯수보다 하나 큼
        else if(oWin && !xWin){
            if(o==x+1) answer = 1;
            else answer = 0;
        }
        
        // X가 승리했을 경우 O와 X의 갯수가 동일해야 함
        else if(!oWin && xWin){
            if(o==x) answer = 1;
            else answer = 0;
        }
        
        // 아무도 승리하지 못했을 경우 o가 x랑 같거나 하나 더 큼
        else if(!oWin && !xWin){
            if (o==x || o==x+1) answer = 1;
            else answer = 0;
        }
        
        return answer;
    }
    
    static boolean isWin(String[] board, char c){
        // 행 열 체크
        for(int i=0; i<3; i++)
            if ((board[i].charAt(0)==c)&&(board[i].charAt(1)==c)&&(board[i].charAt(2)==c)
                    || (board[0].charAt(i)==c)&&(board[1].charAt(i)==c)&&(board[2].charAt(i)==c))
                return true;
        // 대각선 체크
        if((board[0].charAt(0)==c)&&(board[1].charAt(1)==c)&&(board[2].charAt(2)==c)
        || (board[0].charAt(2)==c)&&(board[1].charAt(1)==c)&&(board[2].charAt(0)==c))
            return true;
        
        return false;
    }
}