Lewis's Tech Keep

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

Java/알고리즘

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

Lewis Seo 2024. 7. 29. 22:31

링크

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

 

프로그래머스

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

programmers.co.kr

 

설명

알고리즘 체크보다는 엣지 케이스들을 다 체크 해주는 게 중요했다.

이길 수 없는 경우들을 잘 골라내서 return 해준다.

더보기
// 진행 가능 : 0가 1개 더 많거나 O와 X개수가 같다. (이것이 아닌 경우)
/ oCount와 xCount가 2개 이상 차이 나면 안된다.
// X 개수가 더 많을 수 없다.
// 한쪽이 완료됐는데 다른쪽 완료도 있으면 안됨
// O 완료가 1개인데 O와 X의 개수가 같을 수 없음
// X 완료가 1개인데 O의 개수가 더 많을 때

 

풀이

 

더보기
class Solution {
    public int solution(String[] board) {
        int oCount = 0;
        int xCount = 0;
        String[][] cells = new String[board.length][board[0].length()];
        for (int i=0; i<board.length; i++) {
            String[] boardLine = board[i].split("");
            for (int j=0; j<boardLine.length; j++) {
                String cell = boardLine[j];
                oCount = cell.equals("O") ? oCount + 1 : oCount;
                xCount = cell.equals("X") ? xCount + 1 : xCount;
                cells[i][j] = cell;
            }
        }
        
        // 진행 가능 : 0가 1개 더 많거나 O와 X개수가 같다.
        if (!(oCount == xCount + 1 || oCount == xCount)) {
            return 0;
        }
        
        // oCount와 xCount가 2개 이상 차이 나면 안된다.
        if (Math.abs(oCount - xCount) > 1) {
            return 0;
        }
        
        // X 개수가 더 많을 수 없음
        if (oCount < xCount) {
            return 0;
        }

        int oCompleteCount = 0;
        int xCompleteCount = 0;
        // 행 체크
        for (int i=0; i<board.length; i++) {
            boolean oRowCheck = true;
            boolean xRowCheck = true;
            for (int j=0; j<board.length; j++) {
                if (!cells[i][j].equals("O")) {
                    oRowCheck = false;
                }
                if (!cells[i][j].equals("X")) {
                    xRowCheck = false;
                }
            }
            
            if (oRowCheck) {
                oCompleteCount++;
            }
            
            if (xRowCheck) {
                xCompleteCount++;
            }
        }
        
        // 열 체크
        for (int i=0; i<board.length; i++) {
            boolean oRowCheck = true;
            boolean xRowCheck = true;
            for (int j=0; j<board.length; j++) {
                if (!cells[j][i].equals("O")) {
                    oRowCheck = false;
                }
                if (!cells[j][i].equals("X")) {
                    xRowCheck = false;
                }
            }
            
            if (oRowCheck) {
                oCompleteCount++;
            }
            
            if (xRowCheck) {
                xCompleteCount++;
            }
        }
        
        // 대각선 체크
        if (cells[0][0].equals("O") && cells[1][1].equals("O") && cells[2][2].equals("O")) {
            oCompleteCount++;
        }
        if (cells[0][0].equals("X") && cells[1][1].equals("X") && cells[2][2].equals("X")) {
            xCompleteCount++;
        }
        if (cells[0][2].equals("O") && cells[1][1].equals("O") && cells[2][0].equals("O")) {
            oCompleteCount++;
        }
        if (cells[0][2].equals("X") && cells[1][1].equals("X") && cells[2][0].equals("X")) {
            xCompleteCount++;
        }
        
        // 한쪽이 완료됐는데 다른쪽 완료도 있으면 안됨
        if (oCompleteCount > 0 && xCompleteCount > 0) {
            return 0;
        }
        // 완료가 1개인데도 진행했다면 불가
        // O 완료가 1개인데 O와 X의 개수가 같을 수 없음
        if (oCompleteCount == 1 && xCount >= oCount) {
            return 0;
        }
        
        // X 완료가 1개인데 O의 개수가 더 많을 때 
        if (xCompleteCount == 1 && oCount > xCount) {
            return 0;
        }
        
        return 1;
    }
}
Comments