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

최민길(Gale)·2023년 7월 6일
1

알고리즘

목록 보기
90/172

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/160585

이 문제는 문제의 조건을 꼼꼼하게 구현하면 풀 수 있습니다. 이 문제의 가장 어려운 부분은 반례를 찾는 부분입니다. 주의해야 할 부분은 크게 3가지입니다.

  1. O와 X의 개수
  • O가 선공이기 때문에 O가 X의 수가 같거나 딱 1개만 많아야 합니다.
  • 따라서 둘 사이의 차가 1보다 크거나 X의 수가 O보다 많을 경우 실패합니다.
  1. O가 성공했을 경우
  • O가 선공이기 때문에 O가 성공한 상황에서 X도 성공해서는 안됩니다.
  • O가 성공했을 경우 반드시 X와 1개 차이가 나야하기 때문에 위의 1번에서 O와 X의 수가 같은 경우 역시 불가능합니다.
  1. X가 성공했을 경우
  • X가 후공이기 때문에 성공 시 O와 X의 수가 반드시 같아야 합니다.

다음은 코드입니다.

import java.util.*;

class Solution {
    static String[][] map = new String[3][3];
    static int oNum=0, xNum=0;
    
    public int solution(String[] board) {
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length();j++){
                char curr = board[i].charAt(j);
                if(curr == 'O') oNum++;
                else if(curr == 'X') xNum++;
                
                map[i][j] = String.valueOf(curr);
            }
        }
        
        int diff = Math.abs(oNum-xNum);
        if(diff > 1 || xNum>oNum) return 0;
    
        if (isWin("O") && xNum + 1 != oNum) return 0;
        if (isWin("X") && xNum != oNum) return 0;
        
        return 1;
    }
    
    static boolean isWin(String piece){
        // 가로 방향 체크
        for(String[] element : map){
            if(element[0].equals(piece) && 
               element[1].equals(piece) && 
               element[2].equals(piece)
              ) return true;
        }
        
        // 세로 방향 체크
        for(int i=0;i<3;i++){
            if(map[0][i].equals(piece) && 
               map[1][i].equals(piece) && 
               map[2][i].equals(piece)
              ) return true;
        }
        
        // 대각선 방향 체크
        if(map[0][0].equals(piece) && 
           map[1][1].equals(piece) && 
           map[2][2].equals(piece)) return true;
        if(map[0][2].equals(piece) && 
           map[1][1].equals(piece) && 
           map[2][0].equals(piece)) return true;
        
        return false;
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글