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

정상민·2023년 9월 19일

문제링크

문제 접근

  • 원하는 답은 규칙을 지켜서 나올 수 있는 경우인지 아닌지!
  • 선공 O, 후공 X 이므로 X가 O보다 많을 수 없다
  • O 와 X 갯수의 차이는 1 또는 0
  • 빙고가 하나라도 나오면 그 즉시 게임 종료
  • O나 X로 빙고 갯수가 2를 초과할 수 없다
  • X로 빙고가 되었다면 O와 X의 갯수가 똑같아야 함
  • O로 빙고가 되었다면 O가 X보다 1개 많아야 함

코드

class Solution {
    static int[] di = {1,0,1,1};
    static int[] dj = {0,1,1,-1};
    public int solution(String[] board) {
        int cntO = 0;
        int cntX = 0;
        int madeO = 0;
        int madeX = 0;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                char now = board[i].charAt(j);
                if(now == 'O') cntO++;
                else if(now == 'X') cntX++;
                
                if(now != '.'){   
                     for(int d=0;d<4;d++){
                         int nexti1 = i + di[d];
                         int nextj1 = j + dj[d];
                         int nexti2 = i + di[d] + di[d];
                         int nextj2 = j + dj[d] + dj[d];
                         if(nexti1<0 || nexti1>=3 || nextj1<0 || nextj1>=3 || nexti2<0 || nexti2>=3 || nextj2<0 || nextj2>=3) continue;
                         if(board[nexti1].charAt(nextj1)==now && board[nexti2].charAt(nextj2)==now){
                             if(now == 'O') madeO++;
                             else if(now == 'X') madeX++;
                         }
                     }
                }
            }
        }
        if(cntX > cntO || Math.abs(cntX - cntO) > 1) return 0;
        if(madeO + madeX > 2) return 0;
        if(madeX == 1 && cntO != cntX) return 0;
        if(madeO == 1 && cntO == cntX) return 0;
        return 1;
    }
}

결과


정리

  • 주어진 board를 돌면서 O,X의 갯수 및 빙고 갯수를 카운트
  • 이후 게임 규칙에 따라서 나올 수 없는 경우인지 확인하여 return
profile
안녕하세요! 개인 공부를 꾸준히 기록하는 공간입니다.

0개의 댓글