프로그래머스 - 틱택토 게임(Java)


프로그래머스 - 틱택토 게임(Java)

문제 링크 : 틱택토 게임

틱택토 게임 이란?

틱택토 게임은 우리나라 오목과 비슷하다. 3*3 보드판에서 O 와 X 를 번갈아 가면서 두고 가로,세로,대각으로 한줄이 완성 되면 이기는 게임이다.


문제 해결 접근법

이번 문제는 규칙을 찾는게 가장 핵심이 었다.

규칙

  • 보드가 전부 비었다면 아직 시작 하지 않았으므로 (정상)
  • 항상 O 부터 게임을 시작 하기 때문에 X > O 가 되면 (규칙 위반)
  • O 를 X 보다 1개 이상(2개) 두었다면 (규칙 위반)
  • O 와 X 둘다 빙고가 될 수 없다(규칙 위반)
  • O 가 빙고 라면 O 는 X 보다 항상 1개가 많아야 한다. (아니면 규칙 위반)
  • X 가 빙고 라면 X 는 O 와 수가 같아야 한다. (아니면 규칙 위반)

소스

public class 틱택토게임 {
    public int solution(String[] board) {
        int answer = 1;

        int o = 0;
        int x = 0;
        int n = 0;
        for (String s : board) {
            for (int j = 0; j < s.length(); j++) {
                String item = String.valueOf(s.charAt(j));
                if ("O".equals(item)) {
                    o++;
                } else if ("X".equals(item)) {
                    x++;
                } else {
                    n++;
                }
            }
        }
        
        //시작 하지 않은 상태 이므로 정상.
        if(n == 9){
            return 1;
        } 
        // X 가 O 보다 수가 많으면 규칙위반
        // O 가 X 보다 1개 이상 많이 두었다면 규칙 위반. 
        else if(x - o > 0 || o - x > 1){
            return 0;
        }

        //빙고 체크
        boolean O_bingo = bingo("O", board);
        boolean X_bingo = bingo("X", board);

        //두개다 빙고 일 수 없다.
        if (O_bingo && X_bingo) {
            return 0;
        } 
        else if (O_bingo) {
            //O 가 빙고 라면 O 는 X 보다 항상 1개가 많다.
            if (o - x == 1) {
                return 1;
            }
            return 0;
        } else if (X_bingo) {
            //X 가 빙고 라면 X 는 O 와 수가 같다.
            if (x == o) {
                return 1;
            }
            return 0;
        }
        return answer;
    }

    private boolean bingo(String item, String[] board){
        //가로
        for (String s : board) {
            if (String.valueOf(s.charAt(0)).equals(item)
                    && String.valueOf(s.charAt(1)).equals(item)
                    && String.valueOf(s.charAt(2)).equals(item)
            ) {
                return true;
            }
        }

        //세로
        for (int i = 0 ; i < board.length; i++) {
            if(String.valueOf(board[0].charAt(i)).equals(item)
                    && String.valueOf(board[1].charAt(i)).equals(item)
                    && String.valueOf(board[2].charAt(i)).equals(item)
            ){
                return true;
            }
        }

        //대각
        if(String.valueOf(board[1].charAt(1)).equals(".")) return false;
        if(String.valueOf(board[0].charAt(0)).equals(item)
                && String.valueOf(board[1].charAt(1)).equals(item)
                && String.valueOf(board[2].charAt(2)).equals(item)){
            return true;
        }else if(String.valueOf(board[0].charAt(2)).equals(item)
                && String.valueOf(board[1].charAt(1)).equals(item)
                && String.valueOf(board[2].charAt(0)).equals(item)
        ){
            return true;
        }

        return false;
    }

    @Test
    void 틱택토게임_테스트(){
        Assertions.assertThat(solution(new String[] {"O.X", ".O.", "..X"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"OOO", "...", "XXX"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"XXX", "...", "OOO"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"...", ".X.", "..."})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"...", "...", "..."})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"OXO", ".OX", "OXX"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"XXX", "XOO", "OOO"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"XOX", "OOO", "XOX"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"OOO", "OOO", "XXX"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"OOO", "OXX", "OXX"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"...", ".X.", "..."})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"OXO", "XOX", "OXO"})).isEqualTo(1);

        Assertions.assertThat(solution(new String[] {"OXO", "XOX", "OXO"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"OOX", "XXO", "OOX"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"XXX", ".OO", "O.."})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"OX.", ".O.", ".XO"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"...", "...", ".O."})).isEqualTo(1);

        Assertions.assertThat(solution(new String[] {"X.X", "X.O", "O.O"})).isEqualTo(1);

        Assertions.assertThat(solution(new String[] {"XO.", "OXO", "XOX"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"OOO", "XOX", "XXO"})).isEqualTo(1);
        Assertions.assertThat(solution(new String[] {"OOO", "XOX", "X.X"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"XXX", "OO.", "OO."})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {".X.", "...", "..."})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {".X.", "X..", ".O."})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"XOX", "OXO", "XOX"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"XXX", "XOO", "OOO"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"OOX", "OXO", "XOO"})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"OOX", "OXO", "XOX"})).isEqualTo(0);

        Assertions.assertThat(solution(new String[] {".OX", "OXO", "XO."})).isEqualTo(0);
        Assertions.assertThat(solution(new String[] {"OOO", "XX.", "X.."})).isEqualTo(0);
    }
}

Back to blog