알고리즘/프로그래머스

혼자서 하는 틱택토

베리영young 2024. 7. 27. 13:29

사용 알고리즘: 굳이 쓴다면 bfs나 dfs를 써야겠지만, 3*3으로 크기가 정해져 있기 때문에 쓸 필요가 없다

사용 언어: java

 

틀린 코드

class Solution {
    static int[] dx = {1,-1,0,0}; //상하 좌우 -> 대각선
    static int[] dy = {0,0,1,-1};
    
    public int solution(String[] board) {
        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++;
                if(board[i].charAt(j) == 'X') Xcnt++;
            }
        }
        
        // System.out.println(Ocnt+" "+Xcnt);
        if(Ocnt < Xcnt) return 0; //선공의 개수가 더 적으면 비정상
        if(Ocnt >= Xcnt+2) return 0; //두 말의 개수가 2이상 차이 나면 비정상
        
        if(Ocnt==0 && Xcnt==0) return 1; //더 빠른 답 제출ㅎㅎ
        
        
        boolean Otick = ticktackto(board, 'O');
        boolean Xtick = ticktackto(board, 'X');
        
        if(Otick && Xtick) return 0;
        
        return 1;
    }
    
    
    static boolean ticktackto(String[] board, char target) {
        //가로
        for(int i=0; i<3; i++) {
            //3개가 모여야 하니까 시작점이 타겟과 맞을 때만 확인
            if(board[i].charAt(0) == target) {
                if(board[i].charAt(1)==target && board[i].charAt(2)==target) return true;
            }
        }
        
        //세로
        for(int j=0; j<3; j++) {
            if(board[0].charAt(j) == target) {
                if(board[1].charAt(j)==target && board[2].charAt(j)==target) return true;
            }
        }
        
        //대각선 -- 1,1이 target이어야 성립
        if(board[1].charAt(1) == target) {
            if(board[0].charAt(0)==target && board[2].charAt(2)==target ||
              board[0].charAt(2)==target && board[2].charAt(0)==target) return true;
        }
        
        return false;
    }
    
}

 

 

3줄이 완성된 게 있으면, 다시 한 번 수를 따져야 함

class Solution {
    static int[] dx = {1,-1,0,0}; //상하 좌우 -> 대각선
    static int[] dy = {0,0,1,-1};
    
    public int solution(String[] board) {
        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++;
                if(board[i].charAt(j) == 'X') Xcnt++;
            }
        }
        
        // System.out.println(Ocnt+" "+Xcnt);
        if(Ocnt < Xcnt) return 0; //선공의 개수가 더 적으면 비정상
        if(Ocnt >= Xcnt+2) return 0; //두 말의 개수가 2이상 차이 나면 비정상
        
        if(Ocnt==0 && Xcnt==0) return 1; //더 빠른 답 제출ㅎㅎ
        
        
        boolean Otick = ticktackto(board, 'O');
        boolean Xtick = ticktackto(board, 'X');
        
        // if(Otick && Xtick) return 0;
        
        //선공이 이길 경우 => 후공의 개수 + 1 == 선공의 개수
        if(Otick && Ocnt != Xcnt+1) return 0;
        //후공이 이길 경우 => 후공의 개수 == 선공의 개수
        if(Xtick && Ocnt != Xcnt) return 0;
        
        return 1;
    }
    
    
    static boolean ticktackto(String[] board, char target) {
        //가로
        for(int i=0; i<3; i++) {
            //3개가 모여야 하니까 시작점이 타겟과 맞을 때만 확인
            if(board[i].charAt(0) == target) {
                if(board[i].charAt(1)==target && board[i].charAt(2)==target) return true;
            }
        }
        
        //세로
        for(int j=0; j<3; j++) {
            if(board[0].charAt(j) == target) {
                if(board[1].charAt(j)==target && board[2].charAt(j)==target) return true;
            }
        }
        
        //대각선 -- 1,1이 target이어야 성립
        if(board[1].charAt(1) == target) {
            if(board[0].charAt(0)==target && board[2].charAt(2)==target ||
              board[0].charAt(2)==target && board[2].charAt(0)==target) return true;
        }
        
        return false;
    }
    
}

 

 

 

// if(Otick && Xtick) return 0;
        
        //선공이 이길 경우 => 후공의 개수 + 1 == 선공의 개수
        if(Otick && Ocnt != Xcnt+1) return 0;
        //후공이 이길 경우 => 후공의 개수 == 선공의 개수
        if(Xtick && Ocnt != Xcnt) return 0;

 

이 부분을 추가해야 한다. 

if(Otick && Xtick)을 주석 처리한 이유 => 어짜피 아래에서 걸리게 되기 때문!

하지만 이 코드를 추가하면 아주 약간이나마 빨라질 순 있을 거 같다.

'알고리즘 > 프로그래머스' 카테고리의 다른 글

호텔 대실  (0) 2024.08.19
억억단을 외우자 ******  (0) 2024.07.31
숫자 변환하기  (0) 2024.07.25
석유 시추  (0) 2024.07.18
순위검색 ** (다시 풂)  (0) 2024.07.15