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

최민길(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개의 댓글

관련 채용 정보