본문 바로가기
알고리즘

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

by 2won2 2025. 8. 27.

혼자서 하는 틱택토(Lv2)

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

 

제한 사항

  • board의 길이 = board[i]의 길이 = 3
    • board의 원소는 모두 "O", "X", "."으로만 이루어져 있습니다.
  • board[i][j]는 i + 1행 j + 1열에 해당하는 칸의 상태를 나타냅니다.
    • "."은 빈칸을, "O"와 "X"는 해당 문자로 칸이 표시되어 있다는 의미입니다.

 

 

 

풀이

이번 문제는 조건을 잘 생각해서 풀었다.
게임이 성립하지 않는 경우는,

  1. 후공인 "X"가 "O"보다 많은 경우, "O"가 "X"보다 2개 이상 많은 경우
  2. "X"와 "O"의 갯수가 같은데 "O"가 게임을 이긴 경우
  3. "O"가 "X"보다 1개 많은데 "X"가 게임을 이긴 경우

로 나누어서 풀었다.

먼저 board 배열을 순회하면서 X와 O의 갯수를 세어준 다음 1번 조건을 체크했다.
다음으로 가로 3줄, 세로 3줄, 대각선 2방향을 계산하는 로직을 작성하여 2,3번 조건을 체크했다.

 

 

 

전체 Code

class Solution {
    public int solution(String[] board) {
        int oCnt=0;
        int xCnt=0;
        for(int i=0; i<board.length; i++){
            for(int j=0; j<board[i].length(); j++){
                if(board[i].charAt(j)=='O') oCnt++;
                else if(board[i].charAt(j)=='X') xCnt++;
            }
        }
        if(xCnt>oCnt || oCnt-xCnt>1) return 0;
        // 갯수가 같은데 O가 정답인 경우
        if(xCnt==oCnt){
            if(check(board,'O')) return 0;
        }
        // 갯수가 1개 많은데 X가 정답인 경우
        else if(oCnt>xCnt){
            if(check(board,'X')) return 0;
        }
        
        return 1;
    }
    private boolean check(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[0].charAt(2)==c&&board[1].charAt(1)==c&&board[2].charAt(0)==c) return true;
        return false;
    }
}