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

🔗 문제 링크

코딩테스트 연습 - 혼자서 하는 틱택토


풀이

게임 규칙을 어겨 성립이 안되는 불가능한 상황을 생각해 구현해준다.

불가능한 경우는 아래와 같다.

  1. X > O 인 경우
    • O가 항상 선공이므로 X>O 는 성립될 수 없음.
  2. O가 X보다 2 이상 큰 경우
  3. O와 X 모두 승리 하는 경우
  4. X만 승리하고 O > X 인 경우
    • X는 후공이기 때문에 X만 승리했을 때 게임이 바로 끝나므로 O와 X 크기는 같아야 함.
  5. O만 승리하고 O==X 인 경우
    • O는 선공이기 때문에 O만 승리했을 때 게임이 바로 끝나므로 O와 X크기는 같을 수 없음.

💡 고찰

아래 그림을 보면 O가 승리 조건에 만족한 상황에 지속적으로 게임을 진행한 상황이라 생각할 수 있지만.
image
아래 그림과 같이 게임을 진행하면 게임 규칙에 어긋나지 않는 승리조건이 될 수 있다.
image

위에 조건만 헷갈리지 않으면 손쉽게 해결 할 수 있는 문제


💻 소스코드


class 혼자서하는틱텍토Solution {
    public int solution(String[] board) {
        int answer = 1;
        char map[][] = new char[3][3];

        int O = 0;
        int X = 0;
        int SO = 0;
        int SX = 0;

        for (int i = 0; i < 3; i++) {
            String str = board[i];
            for (int j = 0; j < 3; j++) {
                map[i][j] = str.charAt(j);
                if (map[i][j] == 'X') X++;
                else if (map[i][j] == 'O') O++;
            }
        }

        // X > O 또는 O-1 > X 이면 0
        if (X > O || O - 1 > X) answer = 0;

        if (O >= 3) {
            SO = check('O', map);
        }

        if (X >= 3) {
            SX = check('X', map);
        }

        // X, O 둘 다 승리할 수 없음.
        if (SO == 1 && SX == 1) answer = 0;
        // X가 후공이기 때문에 X가 승리했을 때 O와X 크기는 같아야 함.
        if (SX == 1 && O > X) answer = 0;
        // O가 선공이기 때문에 O가 승리했을 때 O와X 크기는 같을 수 없음.
        if (SO == 1 && O == X) answer = 0;

        return answer;
    }

    static int check(char ch, char[][] map) {
        int res = 0;

        for (int i = 0; i < 3; i++) {
            int row = 0;
            int col = 0;
            for (int j = 0; j < 3; j++) {
                if (map[j][i] == ch) row++;
                if (map[i][j] == ch) col++;
            }
            if (row == 3) res++;
            if (col == 3) res++;
        }

        if (map[0][0] == ch && map[1][1] == ch && map[2][2] == ch) res++;
        if (map[0][2] == ch && map[1][1] == ch && map[2][0] == ch) res++;

        return res;
    }
}

public class pg_혼자서하는틱텍토 {
    public static void main(String[] args) {
        혼자서하는틱텍토Solution solution = new 혼자서하는틱텍토Solution();
        String[] board = {"OXO", "XOX", "OXO"};
        solution.solution(board);
    }
}

Leave a comment