Algorithm/Programmers

160585. 혼자하는 틱택토

사랑우주인 2025. 3. 27. 21:22

문제

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

제한 사항

풀이

class Solution {
    public int solution(String[] board) {
        int answer = -1;
        int oCnt = 0;
        int xCnt = 0;
    
        for(int i = 0 ; i< 3;i++) 
            for(int j = 0 ; j < 3 ; j++) {
                if(board[i].charAt(j) == 'O')
                    oCnt++;
                else if(board[i].charAt(j) == 'X') 
                    xCnt++;
            
        }
        
        // O가 선공이기 때문에 X는 O보다 많을 수 없다.
        // O는 X보다 많을 수 있지만 1개를 넘길 수 없다.
        if(xCnt > oCnt || oCnt-xCnt >1) 
            return 0;
        
    
        // O가 이기는 수
        boolean isOWin = checkWin(board, 'O');
        // X가 이기는 수
        boolean isXWin = checkWin(board, 'X');
        
        
        // O가 이겼는데 O와 X의 수가 동일할 수 없다.
        if(isOWin && oCnt == xCnt) return 0;
        // X가 이겼는데 O가 X의 수보다 많을 수 없다.
        if(isXWin && oCnt > xCnt) return 0;
        return 1;
    }
    
    
    boolean checkWin(String[] board, char p) {
        // 가로
        for(int i = 0 ; i < 3 ; i++) {
            if(board[i].charAt(0) == p && board[i].charAt(1) == p && board[i].charAt(2) == p)
                return true;
        }
        // 세로
        for(int i = 0 ; i < 3 ; i++) {
            if(board[0].charAt(i) == p && board[1].charAt(i) == p && board[2].charAt(i) == p)
                return true;
        }
        
        // 대각선
        if((board[0].charAt(0) == p && board[1].charAt(1) == p && board[2].charAt(2) == p) ||
          (board[2].charAt(0) == p && board[1].charAt(1) == p && board[0].charAt(2) == p))
            return true;
        
        return false;
    }
}

회고

게임에서 나올 수 없는 수가 있으면 0을 반환하고 그 외(게임에서 나올 가능성이 있는 수)는 1을 반환한다. 나올 수 없는 경우의 수가 더 적기 때문에 해당 경우를 필터링했다.

  1. O가 선공이기 때문에, O은 X보다 많을 수 있지만 1개를 넘을 수 없고, X는 O보다 많을 수 없다.
  2. O가 이길 경우, O가 선공이기 때문에 O는 반드시 X보다 많다. 정확히 말하면 O는 X보다 1개 더 많을 것이다. 
  3. X가 이길 경우, X는 O와 개수가 동일할 것이다. O가 선공이기 때문에 X가 이긴 시점에서 O의 수는 X와 동일할 것이다.