프로그래머스

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

진철 2023. 3. 7. 22:47
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

프로그래머스

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

programmers.co.kr

코드를 작성하기 위한 순서는 다음과 같다.

1. O나 X로 한 줄을 만들었는지 확인하는 함수를 작성한다.

2. O와 X의 갯수를 반환하는 함수를 작성한다.

3. O와 X로 모두 한 줄을 만들었다면 해당 경우는 있을 수 없는 경우이므로 0을 반환한다.

4. O로만 한 줄을 만들었다면 O가 선공이므로 X의 갯수보다 O의 갯수가 하나 더 많다면 1을 반환하고 그렇지 않으면 0을 반환한다.

5. X로만 한 줄을 만들었다면 X가 후공이므로 X의 갯수와 O의 갯수가 같다면 1을 반환하고 그렇지 않다면 0을 반환한다.

6. 한 줄로 만든 경우가 없다면 O의 갯수와 X의 갯수가 같거나(마지막으로 X를 둔 경우임) O의 갯수가 X의 갯수보다 하나 더 많다면(마지막으로 O를 둔 경우임) 1을 반환하고 그렇지 않다면 0을 반환한다.

 

def check(board, ox): #1번
    for i in range(len(board)):
        if board[i][0] == ox and board[i][1] == ox and board[i][2] == ox:
            return True
    for i in range(len(board)):
        if board[0][i] == ox and board[1][i] == ox and board[2][i] == ox:
            return True
    if board[0][0] == ox and board[1][1] == ox and board[2][2] == ox:
        return True
    if board[0][2] == ox and board[1][1] == ox and board[2][0] == ox:
        return True
    return False

def count(board): #2번
    o = 0
    x = 0
    for i in board:
        for j in i:
            if j == 'O':
                o += 1
            elif j == 'X':
                x += 1
    return o, x

def solution(board):
    o, x = count(board)
    if check(board, 'O') and check(board, 'X'): #3번
        return 0
    if check(board, 'O') and not check(board, 'X'): #4번
        if o-1 == x:
            return 1
        else:
            return 0
    elif check(board, 'X') and not check(board, 'O'): #5번
        if o == x:
            return 1
        else:
            return 0
    else:
        if o == x or x+1 == o: #6번
            return 1
        else:
            return 0

 

게임에서 이기는 경우를 생각해서 차근차근 조건을 제시하여 풀 수 있는 문제였다.

특히 O가 선공이라는 점에서 4, 5, 6번을 생각하는 게 핵심이었던 거서 같다.

참고로 필자는 5, 6번을 생각하지 못해서 꽤나 시간이 걸렸다. (틱택토보다는 오목이 더 재밌는뎀 ㅎ)

728x90
반응형