s5unnyjjj's LOG

[홀로 하는 코딩 공부] 혼자서 하는 틱택토(Python) 본문

Algorithm/Python

[홀로 하는 코딩 공부] 혼자서 하는 틱택토(Python)

s5unnyjjj 2024. 4. 22. 22:48

프로그래머스

사용 언어: Python

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

 

프로그래머스

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

programmers.co.kr

 

*** 본 문제를 푸는 과정을 공유하려 한다.


▶ 문제에 주어진 테스트 케이스랑 문제에 작성된 "규칙을 어기는 실수"에 해당하는 부분을 고려하여 작성하였다.

def check_winning(board):
    win_O, win_X = 0, 0
    
    if board[0][0] == board[1][1] == board[2][2]:
        if board[0][0] == "O":
            win_O += 1
        elif board[0][0] == "X":
            win_X += 1
    
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2]:
            if board[i][0] == "O":
                win_O += 1
            elif board[i][0] == "X":
                win_X += 1
        if board[0][i] == board[1][i] == board[2][i]:
            if board[0][i] == "O":
                win_O += 1
            elif board[0][i] == "X":
                win_X += 1
    
    return [win_O, win_X]
    
def solution(board):
    num_O, num_X = 0, 0
    for i in range(3):
        for j in range(3):
            if board[i][j] == "O":
                num_O += 1
            elif board[i][j] == "X":
                num_X += 1
    if num_O == 0 and num_X == 0:
        return 1
                
    win_O, win_X = check_winning(board)
    
    if win_O and win_X:
        return 0
    
    if num_O == num_X:
        if win_O >= 1:
            return 0
        else:
            return 1
        
    if num_O == (num_X + 1):
        if (win_O == 0 and win_X >= 1):
            return 0
        else:
            return 1
        
    return 0

 

 

 

 

92.6점이 나왔다. return 1이나 0을 결정하는 부분에서 예외 케이스가 있을 거라 생각하고 해당 부분의 코드를 찾아보고 테스트 케이스를 추가해도 답이 안보였다. 그래서 생각을 바꿔서 승리 여부를 결정하는 check_winning에 실수가 있지않을까 싶어 해당 부분을 봤다. 어이없는 실수였다. 대각선을 왼쪽위에서 시작하는 것만 체킹하고 오른쪽위에서 시작하는 것을 체킹하지 않았던것이었다. 해당부분을 추가하였다.

def check_winning(board):
    win_O, win_X = 0, 0
    
    if board[0][0] == board[1][1] == board[2][2]:
        if board[0][0] == "O":
            win_O += 1
        elif board[0][0] == "X":
            win_X += 1
    
    if board[0][2] == board[1][1] == board[2][0]:
        if board[0][2] == "O":
            win_O += 1
        elif board[0][2] == "X":
            win_X += 1
        
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2]:
            if board[i][0] == "O":
                win_O += 1
            elif board[i][0] == "X":
                win_X += 1
        if board[0][i] == board[1][i] == board[2][i]:
            if board[0][i] == "O":
                win_O += 1
            elif board[0][i] == "X":
                win_X += 1
    
    return [win_O, win_X]
    
def solution(board):
    num_O, num_X = 0, 0
    for i in range(3):
        for j in range(3):
            if board[i][j] == "O":
                num_O += 1
            elif board[i][j] == "X":
                num_X += 1
    if num_O == 0 and num_X == 0:
        return 1
                
    win_O, win_X = check_winning(board)
    
    if win_O and win_X:
        return 0
    
    if num_O == num_X:
        if win_O >= 1:
            return 0
        else:
            return 1
        
    if num_O == (num_X + 1):
        if (win_O == 0 and win_X >= 1):
            return 0
        else:
            return 1
        
    return 0

 

 

 

통과다. 난이도가 있는 문제는 아닌 것 같다.


>> 위 내용은 필자가 코딩테스트 문제를 푼 코드입니다.

>> 부족한 점이 많을 수 있기에 잘못된 내용이나 궁금한 사항이 있으면 댓글 달아주시기 바랍니다.

>> 긴 글 읽어주셔서 감사합니다. 

반응형
Comments