programmers/Lv 2

혼자서 하는 틱택토 [자바]

Meluu_ 2025. 1. 14. 21:06

 

🧫 문제 분석

✔️ 출처

혼자서 하는 틱택토 level 2

📖 문제

 

단순 구현 문제인듯 하다. 

간단하다. 머쓱이가 잘못 둔것과 별개로 그저 현재 주어진 게임판이 나올수 있는 게임 상황인지 아닌지만 판단하면 된다. 

 

내가 생각했을 때 나올 수 없는 상황을 생각해봤다. 

 

나올 수 없는 상황

  • O의 개수 - 2 >= X 개수 
  • O의 개수 < X 개수 
  • O가 빙고했는데 X의 개수가 O와 같거나 클때
  • X가 빙고했는데 O의 개수가 클때

O 빙고가 우선권을 가짐 (O 빙고와 X빙고 둘다 있을 경우)

 

 

처음 O와 X의 개수를 구하고 위 2가지 경우에 대해서 체크한다음 이상이 없다면

가로, 세로, 대각선 빙고를 체크해서 아래 2가지 경우에 대해서 체크한다. 

 


🔅 문제 풀이

class Solution {
    // 나올 수 없는 상황
    // O의 개수 - 2 >= X 개수 
    // O의 개수 < X 개수 
    // O가 빙고했는데 X의 개수가 O와 같거나 클때
    // X가 빙고했는데 O의 개수가 클때
    // O 빙고가 우선권을 가짐
    
    public int solution(String[] board) {
        int answer = 1;
        
        // O와 X의 개수 카운트
        int countO = 0;
        int countX = 0;        
        
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (board[i].charAt(j) == 'O') {
                    countO++;
                } else if (board[i].charAt(j) == 'X') {
                    countX++;
                }
            }
        }
        
        // 불가능한 개수를 가진 경우                      (게임판이 비었을 때를 따로 체크)
        if (countO - 2 >= countX || ((countO < countX) && (countO > 0 || countX > 0))) {
            return 0;
        } 
        
        // 빙고였을 때 
        // 가로
        for (int i = 0; i < 3; i++) {
            int bingoO = 0;
            int bingoX = 0;
            
            for (char ox : board[i].toCharArray()) {
                if (ox == 'O') bingoO++;
                else if (ox == 'X') bingoX++;
            }
            
            if (!checkBingo(bingoO, bingoX, countO, countX)) return 0;
        }
        
        // 세로
        for (int i = 0; i < 3; i++) {
            int bingoO = 0;
            int bingoX = 0;
            
            for (int j = 0; j < 3; j++) {
                if (board[j].charAt(i) == 'O') {
                    bingoO++;
                } else if (board[j].charAt(i) == 'X') {
                    bingoX++;
                }
            }
            
            if (!checkBingo(bingoO, bingoX, countO, countX)) return 0;
        }
        

        // 대각선
        if (board[0].charAt(0) == board[1].charAt(1) && board[1].charAt(1) == board[2].charAt(2) ||
                board[0].charAt(2) == board[1].charAt(1) && board[1].charAt(1) == board[2].charAt(0)) {
            int bingoO = 0;
            int bingoX = 0;
            
            if (board[1].charAt(1) == 'O') bingoO = 3;
            else bingoX = 3;
            
            if (!checkBingo(bingoO, bingoX, countO, countX)) return 0;
        }

        return answer;
    }
    
    // 빙고 체크
    private boolean checkBingo(int bingoO, int bingoX, int countO, int countX) {
        if (bingoO == 3) {
                if (countO <= countX) return false;
                
            } else if (bingoX == 3) {
                if (countO > countX) return false;
            }
        
        return true;
    }
}

 

 

 

🔅 리팩토링

❗ 오답노트 / 필요한 지식

  1. 가로, 세로, 대각선을 간단하게 생각할 방법을 찾다가 일단 풀어보자라는 생각으로 했다.
  2. 다른 사람의 방식은 한 행 혹은 열에만 배열 접근해서 하드코딩으로 각각 비교하는 방식을 했다. 
    1. board[i].charAt(0) == board[i].charAt(1) && board[i].charAt(1) == board[i].charAt(2) 이런식

 

'programmers > Lv 2' 카테고리의 다른 글

택배상자 [자바]  (0) 2025.01.20
뒤에 있는 큰 수 찾기 [자바]  (0) 2025.01.16
연속된 부분 수열의 합 [자바]  (0) 2025.01.04
두 원 사이의 정수 쌍 [자바]  (0) 2025.01.03
요격 시스템 [자바]  (2) 2024.12.30