본문 바로가기

알고리즘/구현

[프로그래머스] 혼자서 하는 틱택토 Lv2 JAVA [구현][엄탱]

728x90

문제 링크

 

프로그래머스

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

programmers.co.kr

문제 설명

정확한 문제는 링크를 통해 확인하면 된다.

요약해서 설명하자면 해당 문제는 틱택토라는 간단한 게임 규칙을 알아야 하는데 틱택토란 두 사람이 하는 게임으로 처음에 3x3의 빈칸으로 이루어진 게임판에 선공이 "O", 후공이 X"를 번갈아 가면서 빈칸에 표시하면서 "O"나 "X"가 가로 혹은 세로 대각선으로 한 줄이 나오면 이기는 게임이다.

이때, board라는 틱택토 게임이 진행된 상태를 알려주는 배열이 주어지는데 해당 board가 정상적인 게임 상황인지, 아니면 나올 수 없는 게임 상황인지 파악해서 정상이면 1을 아니라면 0을 return하는 문제이다.

해설

해당 문제는 참고로 코드보다는 어떤 경우에 1처리를 하는지 어떤 경우에 0 처리를 하는지만 알아가도 좋을 것 같다.구현 문제 이기 때문에 따로 알고리즘적 지식이 필요하다기 보단 1과 0이 나오는 조건만 알고 실수 없이 로직을 짜면 되는 문제이다.
특히 구현 문제는 실수가 자주 발생할 수 있기 때문에, 밑에 알려준 조건 로직을 구현했는데도 답이 틀리다고 나오면 실수가 없는지 파악해야 한다.

나는 정상적인 게임만 찾아주고 나머지는 다 비정상적인 게임으로 판단해서 0을 return해주었다.

정상적인 게임 조건

1. "O"와 "X"의 개수는 같거나 O가 1개 더 많다.

 

2. "O"와 "X"의 개수가 같을 때, 무승부(어느 한쪽도 한 줄을 완성 못 시키는 경우) 이거나 후공인 X가 이겨야 된다.

3. "O"가 "X"보다 1개만 더 많을 때, 무승부 이거나 선공인 O가 이겨야 된다.

4. 2번과 3번 외에는 다 비정상적인 게임이다.

5. 이 문제는 한 가지 오류가 있다고 판단된다.

문제 오류

예시1

위와 같이 완성된 한 줄이 2개 생기는 경우에 비정상적인 게임으로 판단하는 로직을 추가하는 경우에  테스트 6, 12, 23, 28, 42번이 실패가 되고, 로직을 제거하면 테스트는 모두 통과된다.

해당 문제가 오류인 건지 아니면 틱택톡 게임에서 위에 방식이 정상인 건지는 모르겠지만 참고하면 좋을 것 같다.

코드

class Solution {
    public int solution(String[] board) {
        int answer = 1;
        
        int[] count = getCount(board);
        
        boolean o = false;
        boolean x = false;
        
        for (int i = 0; i < board.length; i++) {
            String s = board[i];
            
            if (s.equals("OOO")) {
                o = true;
            } else if (s.equals("XXX")) {
                x = true;
            }
            
            if (board[0].charAt(i) == board[1].charAt(i) && 
                board[1].charAt(i) == board[2].charAt(i)) {

                if (board[0].charAt(i) == 'O') {
                    o = true;
                } else if (board[0].charAt(i) == 'X') {
                    x = true;
                }
            }
        }
        
        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)
           ) {
            
            if (board[1].charAt(1) == 'O') {
                o = true;
            } else if (board[1].charAt(1) == 'X') {
                x = true;
            }
        }

        if (count[0] == count[1]) {
            if ((!o && !x) || (x && !o)) {
                return 1;
            }
        } else if (count[0] == count[1] + 1) {
            if ((!o && !x) || (o && !x)) {
                return 1;
            } 
        }
        
        return 0;
    }
    
    private int[] getCount(String[] board) {
        int[] count = new int[2];
        
        for (String s: board) {
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == 'O') {
                    count[0]++;
                } else if(s.charAt(i) == 'X'){
                    count[1]++;
                }
            }
        }
        
        return count;
    }
}
728x90