주녘공부일지

[프로그래머스 C#] Lv.2 혼자서 하는 틱택토 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 혼자서 하는 틱택토

주녘 2024. 1. 11. 16:54
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

- 주먹구구 예외처리 문제로, 간단해 보였지만 생각보다 예외 상황을 찾는 게 골치아팠던 문제

 

1) 한번 씩 번갈아가며 둠

- 후공이 더 많을 수 없고, 선공은 후공과 같거나 1이 커야 함

 

2) 빙고가 생기면 게임은 종료됨

- 선공이 이겼다면 후공은 둘 수 없고, 후공이 이겼다면 선공은 둘 수 없음

- 선공과 후공이 모두 빙고가 생길 수 없음

+ 단, 빙고는 한번에 2개가 생길 수 있으며, 선공만 가능함 ( 생길 수 있는 경우의 수 - 표 참조 )

 

O X O
X O X
O X O
O O O
O X X
O X X
X O X
O O O
X O X

 

주석 참조

    using System;

    public class Solution
    {
        public int solution(string[] board)
        {
            int countO = 0; // 선공 개수
            int countX = 0; // 후공 개수
            int bingoO = 0; // 선공 빙고 개수
            int bingoX = 0; // 후공 빙고 개수

            // 선공 후공 개수 파악
            for (int y = 0; y < 3; y++)
            {
                for (int x = 0; x < 3; x++)
                {
                    if (board[y][x] == 'O') countO++;
                    else if (board[y][x] == 'X') countX++;
                }
            }

            // 후공이 더 둔 경우
            if (countO < countX)
                return 0;

            // 선공이 연속해서 둔 경우
            if (countO - 1 > countX)
                return 0;

            // 대각선 빙고 체크
            if (board[1][1] == 'O')
            {
                if (board[0][0] == 'O' && board[2][2] == 'O') bingoO++;
                if (board[0][2] == 'O' && board[2][0] == 'O') bingoO++;
            }
            else if (board[1][1] == 'X')
            {
                if (board[0][0] == 'X' && board[2][2] == 'X') bingoX++;
                if (board[0][2] == 'X' && board[2][0] == 'X') bingoX++;
            }

            // 가로 빙고 체크
            for (int i = 0; i < 3; i++)
            {
                if (board[i] == "OOO") bingoO++;
                else if (board[i] == "XXX") bingoX++;
            }

            // 세로 빙고 체크
            for (int x = 0; x < 3; x++)
            {
                if (board[0][x] == 'O' && board[1][x] == 'O' && board[2][x] == 'O') bingoO++;
                else if (board[0][x] == 'X' && board[1][x] == 'X' && board[2][x] == 'X') bingoX++;
            }

            // 둘다 빙고가 있는 경우
            if (bingoX > 0 && bingoO > 0)
                return 0;

            // 선공이 이겼는데 후공이 둔 경우
            if (bingoO > 0 && countO == countX)
                return 0;

            // 후공이 이겼는데 선공이 둔 경우
            if (bingoX > 0 && countO > countX)
                return 0;

            return 1;
        }
    }
728x90