상세 컨텐츠

본문 제목

[프로그래머스] 160585. 혼자서 하는 틱택토 | 구현 | 파이썬, 소스코드, 정답

Coding Test/문제풀이

by yooputer 2023. 5. 7. 09:09

본문

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

 

프로그래머스

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

programmers.co.kr


문제 요약

  • 혼자서 틱택토 게임을 한다. 
  • 게임판을 보고 규칙을 지켜서 진행했는지 판단하라.

 


문제 조건

  • 게임판의 크기는 3*3이다. 게임판은 'O', 'X', '.'으로 이루어져 있다. '.'은 빈공간이다.
  • 틱택토 게임은 가로 혹은 세로 혹은 대각선이 같은 표시로 이루어지면 승리한다. 
  • 'O'가 선공이고 번갈아가면서 표시한다
  • 한명이 승리하면 게임은 종료된다. 

시행착오

'O'의 개수가 'X'의 개수보다 1개 많거나 같아야 하고 게임판에 'OOO'와 'XXX'가 동시에 존재하면 안된다는 아이디어로 문제를 풀었다

근데 일부 테스트케이스가 틀렸다고 나왔다

 

그래서 다른분의 풀이를 참고해서 'O'가 승리한경우 'O'의 개수는 'X'의 개수보다 1개 많아야 하고, 'X'가 승리한 경우 'X'의 개수와 'O'의 개수가 같아야 한다는 조건을 알게되었다. 


접근방식

  1. 'O'의 개수는 'X'의 개수보다 1보다 크거나 같아야 한다
  2. 이미 한쪽이 승리한 상태에서 다른 쪽이 승리할 수 없다.
  3. 만약 'O'가 이겼으면 'O'의 개수는 'X'의 개수보다 1보다 커야한다.
    만약 'X'가 이겼으면 'X'의 개수와 'O'의 개수가 같아야 한다.

소스코드

def solution(board):
    cnt_O, cnt_X = 0, 0
    
    for row in board:
        for c in row:
            if c == 'O':
                cnt_O += 1
            elif c == 'X':
                cnt_X += 1

    if not(0 <= cnt_O - cnt_X <= 1):
        return 0

    win = '.'
    for i in range(3):
        if board[i][0] == '.':
            continue
        if board[i][0] == board[i][1] and board[i][1] == board[i][2]:
            if win == '.':
                win = board[i][0]
            elif win != board[i][0]:
                return 0

    for i in range(3):
        if board[0][i] == '.':
            continue
        if board[0][i] == board[1][i] and board[1][i] == board[2][i]:
            if win == '.':
                win = board[0][i]
            elif win != board[0][i]:
                return 0

    if board[0][0] != '.':
        if board[0][0] == board[1][1] and board[1][1] == board[2][2]:
            if win == '.':
                win = board[0][0]
            elif win != board[0][0]:
                return 0

    if board[0][2] != '.':
        if board[0][2] == board[1][1] and board[1][1] == board[2][0]:
            if win == '.':
                win = board[0][2]
            elif win != board[0][2]:
                return 0

    if win == 'X':
        if cnt_X != cnt_O:
            return 0
    elif win == 'O':
        if cnt_O != (cnt_X + 1):
            return 0

    return 1

 

관련글 더보기