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

Arden·2023년 3월 5일

Programmers

목록 보기
1/1

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

문제 : 틱택토에서 실수를 했던, 안했던 그 결과가 규칙에 맞는지 아닌지 판단하기

해결 방법 :
1. 9칸짜리 보드에서 'O'의 개수, 'X'의 개수, '.'의 개수 검사
2. 9칸짜리 보드에서 가로/세로/대각선으로 "OOO", "XXX"인지 검사
3. 선공인 'O'가 이겼을 때와 후공인 'X'가 이겼을 때로 구분

  • 선공과 후공이 동시에 이겼다면 규칙에 안맞음
  • 선공이 이겼을 때 후공의 개수는 선공보다 하나 적어야 함
  • 후공이 이겼을 때 선공의 개수는 후공보다 하나 많거나 똑같아야 함
  • 둘다 이기지 못했을 때 선공의 개수는 후공보다 하나 많거나 똑같아야 함

4.예외로 빈칸이 9개일 때는 규칙에 맞고 굳이 다 검사할 필요 없어서 바로 리턴

class Solution {
    public int solution(String[] board) {
        int answer = -1;
        int onum = 0, xnum = 0, empty = 0;
        boolean owin = false, xwin = false;
        
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(board[i].charAt(j) =='O'){
                    onum++;
                }else if(board[i].charAt(j) =='X'){
                    xnum++;
                }else{
                    empty++;
                }
            }
        }
        
        
        if(empty == 9){
            answer = 1;
            return answer;
        }
        
        // 가로 세로 승자 확인
        for(int i=0;i<3;i++){
            if(board[i].equals("OOO")){
                owin = true;
            }
            if(board[0].charAt(i) == 'O' && board[1].charAt(i) == 'O'){
                if(board[2].charAt(i) == 'O'){
                    owin = true;
                }
            }
            if(board[i].equals("XXX")){
                xwin = true;
            }
            if(board[0].charAt(i) == 'X' && board[1].charAt(i) == 'X'){
                if(board[2].charAt(i) == 'X'){
                    xwin = true;
                    System.out.println("is");
                }
            }
        }
        //대각선 승자 확인
        if(board[0].charAt(0) == 'O' && board[1].charAt(1) == 'O'){
            if(board[2].charAt(2) == 'O'){
                owin = true;
            }
        }
        if(board[0].charAt(2) == 'O' && board[1].charAt(1) == 'O'){
            if(board[2].charAt(0) == 'O'){
                owin = true;
            }
        }
        if(board[0].charAt(0) == 'X' && board[1].charAt(1) == 'X'){
            if(board[2].charAt(2) == 'X'){
                xwin = true;
            }
        }  
        if(board[0].charAt(2) == 'X' && board[1].charAt(1) == 'X'){
            if(board[2].charAt(0) == 'X'){
                xwin = true;
            }
        }
        
        
        if(owin == true && xwin == true){
            answer = 0;
        } else if(owin == true && xwin == false){
            if(onum - xnum == 1){
                answer = 1;
            }else{
                answer = 0;
            }
        } else if(owin == false && xwin == true){
            if(onum - xnum == 0){
                answer = 1;
            } else {
                answer = 0;
            }
        } else{
            if(onum - xnum == 0 || onum - xnum == 1){
                answer = 1;
            } else{
                answer = 0;
            }
        }
        
        return answer;
    }
}
  • 여기서 한참 헤맨 이유. 세로 체크할 때 코드를 아래와 같이 잘못 짬. 그래서 뭐가 틀린건 지 한참 고민하다가 테스트 케이스 추가하면서 확인해봤다.
if(board[i].charAt(0) == 'O' && board[i].charAt(0) == 'O'){
       if(board[i].charAt(2) == 'O'){
           owin = true;
       }
}
profile
잘하자

0개의 댓글