본문 바로가기
알고리즘/프로그래머스

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

by hxxyeoniii 2024. 2. 28.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 풀이

틱택토가 실패하는 경우의 수 생각하기

 

1. X의 개수가 O 보다 많을 수 없다.

2. O와 X의 개수 차이는 0, 1만 가능하다.

3. 'OOO'와 'XXX'가 동시에 만들어질 수 없다.

4. 'OOO'가 만들어졌을 때, O의 개수가 X 보다 1개 더 많아야 한다.

5. 'XXX'가 만들어졌을 때, O와 X의 개수가 같아야 한다.

 

class Solution {
    public int solution(String[] board) {
        int answer = 1;
        int cntO3 = 0; int cntX3 = 0; // "OOO", "XXX" 개수
        int cntO = 0; int cntX = 0; // 총 O, X 개수
        
        String str1 = board[0];
        String str2 = board[1];
        String str3 = board[2];
        
        for(int i=0; i<3; i++) {
            // 세로로 만들어질 수 있는 'OOO', 'XXX' 개수
            if( (str1.charAt(i) == str2.charAt(i)) && (str2.charAt(i) == str3.charAt(i)) ) {
                if(str1.charAt(i) == 'X') {
                    cntX3 += 1;
                } else if(str1.charAt(i) == 'O') {
                    cntO3 += 1;
                }
            }
        }
        
        // 대각선으로 만들어질 수 있는 'OOO', 'XXX' 개수
        if( (str1.charAt(0) == str2.charAt(1)) && (str2.charAt(1) == str3.charAt(2)) ) {
            if(str1.charAt(0) == 'X') {
                cntX3 += 1;
            } else if(str1.charAt(0) == 'O') {
                cntO3 += 1;
            }
        }  
        
        if( (str1.charAt(2) == str2.charAt(1)) && (str2.charAt(1) == str3.charAt(0)) ) {
            if(str1.charAt(2) == 'X') {
                cntX3 += 1;
            } else if(str1.charAt(2) == 'O') {
                cntO3 += 1;
            }
        }
            
            
        for(int i=0; i<3; i++) {
            String str = board[i];
            
            // 가로로 만들어질 수 있는 'OOO', 'XXX' 개수
            if("OOO".equals(str)) {
                cntO3 += 1;
            } else if("XXX".equals(str)) {
                cntX3 += 1;
            }
            
            for(int j=0; j<str.length(); j++) {
                char c = str.charAt(j);
                if(c == 'O') {
                    cntO += 1;
                } else if(c == 'X') {
                    cntX += 1;
                }
            }
        }
        
        // X의 개수가 O보다 많을 수 없다.
        if(cntX > cntO) {
            return 0;
        }
        
        // O와 X의 개수 차이는 0, 1만 가능하다.
        if(cntO - cntX >= 2) {
            return 0;
        }
        
        // 'OOO', 'XXX'가 모두 만들어지는 것은 불가능하다.
        if(cntO3 >= 1 && cntX3 >= 1) {
            return 0;
        }
        
        // 'OOO'가 만들어졌을 때, O의 개수가 X보다 1개 많아야 한다.
        if(cntO3 > 0) {
            if(cntO - cntX != 1) {
                return 0;
            }
        }
        
        // 'XXX'가 만들어졌을 때, O와 X의 개수가 같아야 한다.
        if(cntX3 > 0) {
            if(cntO != cntX) {
                return 0;
            }
        }
        
        return answer;
    }
}