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

‍bng4535·2023년 2월 27일

문제

풀이

  • 틱택토가 불가능한 상황을 고려하여 풀이한다.
    1. x의 개수가 o의 개수보다 많다
    1. x의 개수와 o의 개수 차이가 2이상일 때
    1. 승리한 사람이 두 명
    1. X가 승리하였는데 O와 X의 개수가 다른 경우
    1. O가 승리하였는데 O의 개수가 X의 개수보다 1크지 않은 경우

유의할 점

  • 아무리 많은 경우를 고려해봐도 통과하지 못하는 테스트 케이스가 있어서 마지막으로 틱택토에서 승자가 나오는 경우를 구현한 함수를 수정하였는데 통과했다. 불필요하게 for문을 쓰다 보니 원하는 결과가 나오지 않았다. 단순하게 구현할 수 있다면 길어지더라도 단순하게 코드를 작성해야겠다.

코드

import java.util.*; 
class Solution {
    public int solution(String[] board) {

    int countO = 0; 
    int countX= 0; 
        
    for(int i=0; i<board.length; i++)
    {
        for(int j=0; j<board[0].length(); j++){
            if(board[i].charAt(j)=='O') countO++; 
            else if(board[i].charAt(j)=='X') countX++; 
        }
    }
        
    
    // 불가능한 틱택토 
    //- 틱택토가 불가능한 상황을 고려하여 풀이한다. 
    //- 1. x의 개수가 o의 개수보다 많다 
    //- 2. x의 개수와 o의 개수 차이가 2이상일 때 
    //- 3. 승리한 사람이 두 명 
    //- 4. X가 승리하였는데 O와 X의 개수가 다른 경우 
    //- 5. O가 승리하였는데 O의 개수가 X의 개수보다 1크지 않은 경우 
    if(countO<countX|| Math.abs(countO-countX)>=2) return 0;
    else if (isFinished(board,'O') && isFinished(board,'X')) return 0; 
    else if  (isFinished(board,'X')&& !(countO==countX)) return 0;  
    else if (isFinished(board,'O') && !(countO== countX+1)) return 0; 
    return 1;
    }
    
    
    boolean isFinished(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) return true; 
            
        
        for(int i=0; i<3; i++)
            if(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) return true;
        if(board[2].charAt(0) == c && board[1].charAt(1) == c && board[0].charAt(2) == c) return true;

    return false; 
         
    }
}
profile
공부 기록

0개의 댓글