ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Baekjoon - 24413] Tic-Tac State
    문제 풀이/Baekjoon Online Judge 2023. 2. 13. 20:24

    난이도: Silver III

     

    태그

    더보기
    • Implementation (구현 귀찮아요)
    • Bitmask (이론상 안 써도 되긴 하는데 쓰는 걸 추천)
    • Case Work

     

    풀이

    1. 틱택토 판 재생성

    더보기

    8진수로 들어오는 입력에 대해, 문제에서 나온대로 판을 다시 만들어볼 수 있습니다.

     

    개인적으로는 ,맨 뒷글자의 가장 작은 비트부터 시작해서 읽는 방식을 추천합니다.

     

    2. 결과 판정

    더보기

    가로 3줄, 세로 3줄, 대각선 2줄 중 한 글자로만 채워진 줄이 있다면, 그 줄에 맞게 O wins 또는 X wins를 출력하면 됩니다.

    그렇지 않다면, 아직 채우지 않은 칸의 유무에 따라 Cat's 또는 In progress를 출력하면 됩니다.

     

    3. 구현 디테일

    더보기

    사실 이 문제는 구현이 대부분인지라, 구현에 대한 디테일이 가장 중요합니다.

     

    저의 경우는 입력 → arr[0~17]에 하나씩 비트 저장 → 틱택토 판 생성 → 승패 판정 → 게임 종료 여부 판정 순서로 흘러갔습니다.

     

    4. 코드

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    int arr[32];
    char mp[3][3];
    char chk[8];
     
    void Main(){
        int t; cin >> t; while (t--){
            string s; cin >> s; int sl = s.size();
            memset(arr, 0sizeof(arr));
            int p = 0;
            for (int i = sl-1; i >= 0; i--){
                int x = s[i]-'0';
                arr[p++= x&1;
                arr[p++= x>>1&1;
                arr[p++= x>>2&1;
            }
            bool ply = 0;
            for (int i = 0; i < 3; i++){
                for (int j = 0; j < 3; j++){
                    int p = i*3 + j;
                    mp[i][j] = (arr[p]==0 ? '.' : (arr[p+9]==0 ? 'O' : 'X'));
                    if (mp[i][j] == '.'){ ply = 1; }
                }
            }
            memset(chk, 'O'|'X'sizeof(chk));
            for (int i = 0; i < 3; i++){
                for (int j = 0; j < 3; j++){
                    chk[i] &= mp[i][j];
                    chk[j+3&= mp[i][j];
                }
                chk[6&= mp[i][i];
                chk[7&= mp[i][2-i];
            }
            bool flg = 1for (int i = 0; i < 8; i++){
                if (chk[i] == 'O' || chk[i] == 'X'){ cout << chk[i] << " wins"; flg = 0break; }
            }
            if (flg){ cout << (ply ? "In progress" : "Cat\'s"); }
            cout << endl;
        }
    }
    cs
Designed by Tistory.