-
[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. 코드
더보기123456789101112131415161718192021222324252627282930313233343536373839int 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, 0, sizeof(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 = 1; for (int i = 0; i < 8; i++){if (chk[i] == 'O' || chk[i] == 'X'){ cout << chk[i] << " wins"; flg = 0; break; }}if (flg){ cout << (ply ? "In progress" : "Cat\'s"); }cout << endl;}}cs '문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon - 18392] SHOP (0) 2023.02.13 [Baekjoon - 22971] 증가하는 부분 수열의 개수 (0) 2023.02.13 [Baekjoon - 3189] tomo (0) 2023.02.13 [Baekjoon - 18242] 네모네모 시력검사 (0) 2023.02.13 [Baekjoon - 14730] 謎紛芥索紀 (Small) (0) 2023.02.13