시작하는 중

프로그래머스 - 혼자서 하는 틱택토 본문

알고리즘/프로그래머스

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

싱욱 2023. 2. 24. 17:21

 

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

 

프로그래머스

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

programmers.co.kr

 

난생 처음 반례를 처음 제출해본 문제이다!

 

반례 생각해낸게 흥분되서 ㅋㅋ 풀다가 다른거 공부하는데 집중못했고 이거 다시푸는데도 집중 못했음 ㅠㅠ

 

바로 정답 도출 flow

정답이 되는 케이스와 O빙고, X빙고 둘 다 존재하는 경우를 제외하면 return을 해주면 된다.

 

정답이 되는 케이스는

1. 빙고가 없을 경우 O가 X보다 1개 많거나 O와 X가 같은 경우(0개를 포함)

2. 빙고가 있는 경우

2-1. O빙고와 X빙고가 둘 다 존재하면 정답이 아님!!

2-2. O빙고만 존재하면 O가 X보다 하나 더 많아야 함

2-3. X빙고만 존재하면 X와 O의 숫자가 같아야 함

 

1. board 배열 순회하며 O와 X의 갯수를 세며 OX 배열에 저장

2. 가로 세로 대각선에 대한 빙고를 확인하며 winner 배열에 저장

3. winner 배열에 대해 정답이 되는 케이스 조건문 검사

 

def solution(board):
    answer = 0
    
    OX = [0,0]
    for y in range(3):
        board[y] = list(board[y])
        for x in range(3):
            if board[y][x] == "O":
                OX[0] += 1
            elif board[y][x] == "X":
                OX[1] += 1
                
    # O와 X의 갯수에 대한 계산
    if OX[1] > OX[0]:
        return 0
    if OX[0] > OX[1] + 1:
        return 0
    if OX[0] == 0 and OX[1] == 0:
        return 1
    
    winner = []
    
    # 가로, 세로 빙고 계산
    for i in range(3):
        if board[i][0] != ".":
            for x in range(3):
                if board[i][x] != board[i][0]:
                    break
            else:
                winner.append(board[i][0])
                
        if board[0][i] != ".":
            for y in range(3):
                if board[y][i] != board[0][i]:
                    break
            else:
                winner.append(board[0][i])
    
    # 빙고 계산
    if board[0][0] != ".":
        for i in range(1,3):
            if board[i][i] != board[0][0]:
                break
        else:
            winner.append(board[0][0])        
    
    if board[0][2] != ".":
        for i in range(1,3):
            if board[i][2-i] != board[0][2]:
                break
        else:
            winner.append(board[0][2])
    
    # 규칙에 대한 검사
    if winner:
        if "X" in winner and "O" in winner:
            pass
        else:
            if winner[0] == "O":
                if OX[0] == OX[1] + 1:
                    return 1
            else:
                if OX[0] == OX[1]:
                    return 1
    else:
        if OX[0] == OX[1] + 1 or OX[0] == OX[1]:
            return 1
    return answer