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

allnight5·2023년 5월 9일
0

프로그래머스

목록 보기
63/73

링크

/*
빙고인지 아닌지 확인하는법.
첫번째 꼭지점과 끝 꼭지점에서 대각선으로 확인한다.
비어있거나 다른거라면 false로 하고 돌아온다.
열 첫번째 라면 가로를 확인한다.
대각선과 마찬가지로 비어있거나 다른거라면 false로 반환한다.
첫번째 줄이라면 세로를 확인한다.
대각선과 마찬가지로 비어있거나 다른거라면 false로 반환한다.

성공 1인경우
O나 X둘중 하나만 성공해야한다. 둘다 성공시 실패다.
O가 성공이라면 X보다 하나 더 많아야한다.
X가 성공이라면 O과 갯수가 같아야한다.
O는 항상 X보다 같거나 커야한다 작을 수 없다.

성공이 아니라면 0이다.

*/
class Solution {
    public int solution(String[] board) { 
        int oCount = countCounter(board, 'O');
        int xCount = countCounter(board, 'X'); 
        boolean oSuccess = false;
        boolean xSuccess = false;
        
        if(xCount> oCount) return 0;
        if(oCount-xCount>1) return 0;
        
        if(oCount>2){
            oSuccess = isBigo(board, 'O');
        }
        if(xCount>2){
            xSuccess = isBigo(board, 'X');
        }  
        
        if(oSuccess && xSuccess) return 0;
        if(xSuccess && xCount != oCount) return 0; 
        if(oSuccess && oCount <= xCount) return 0;
        
        return 1;
    }
    
    private boolean isBigo(String[] board, char c){
        int endPoint = board[0].length();
 
        for(int i=0; i<board.length; i++){
            if(i==0){
                for(int j=0; j<endPoint;j++){
                    if(isColumn(board,c,j)){
                        return true;
                    }
                }
                if(board[0].charAt(0) == c){
                    if(diagonal(board,c,0)){
                        return true;
                    }
                }
                if(board[0].charAt(endPoint-1) == c){
                    if(diagonal(board,c,1)){
                        return true; 
                    }
                }
            } 
            
            if(isRow(board,c,i)){
                return true;
            }
        }
        
        return false;
    }
    
    private boolean isRow(String[] board, char c, int point){
        for(int i=0; i<board[point].length();i++){
            if(board[point].charAt(i) != c){
                return false;
            }
        }
        return true;
    }
    private boolean isColumn(String[] board, char c, int point){
        for(int i = 0; i<board.length;i++){
            if(board[i].charAt(point) !=c){
                return false;
            }
        }
        return true;
    }
    
    //point는 꼭지점 맨위에서 처음과 끝 두개로 나누는 부분이다.
    private boolean diagonal(String[] board, char c, int point){
        int n = board[0].length(); 
        if(point == 0){
            for(int i=1; i< n; i++){ 
                if(board[i].charAt(i) != c){
                    return false;
                } 
            }
        }else{ 
            for(int i=1; i<n;i++){   
                if(board[i].charAt(n-1-i) != c){
                    return false;
                } 
            }
        }
        return true;
    }
    
    private int countCounter(String[] board, char c){
        int count =0;
        for(String str : board){
            for(char isC : str.toCharArray()){
                if(isC == c) count++;
            }
        }
        return count; 
    }
}

테스트 코드에서 계속 실패했는데.. 그이유는

if(board[0].charAt(0) == c){
    if(diagonal(board,c,0)){
        return true;
    }
}
else if(board[0].charAt(endPoint-1) == c){
    if(diagonal(board,c,1)){
        return true; 
    }
}

첫번째 꼭지점 대각선을 확인하고 다음것도 확인해야하는데..
else if인터라 첫번째 것이 맞으면 다음것을 확인 하지 않았다..
이것 때문에 1시간이나 지나서..
다음에는 else if와 if문이 알맞게 들어갔는지 확인해야겠다.

profile
공부기록하기

0개의 댓글