Algorithm/프로그래머스

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

RIEN😚 2023. 3. 3. 14:11
728x90
반응형
 

프로그래머스

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

programmers.co.kr

 

1. 문제

선공이 'O', 후공이 'X'이며 번갈아 가면서 표시하는 게임을 진행하고 있습니다.

현재 게임판의 상태가 주어질 때, 해당 게임판 상태가 가능한지 여부를 확인해보자

 

[입력]

틱택토 게임판의 정보를 담고 있는 문자열 배열 board

 

[출력]

가능한 게임판 상태이면 1을 아니라면 0을 return

 

2. 풀이

현 상태가 가능한지 판단하는 조건을 잘 구별하면 풀 수 있는 문제입니다.

 

2.1 O과 X의 개수

문제를 보면 O이 먼저 시작하고 그 이후에 X를 두어야 하므로 O의 개수는 반드시 X와 같거나 1 커야 합니다.

이를 코드로 표현하면

first, second = 0, 0 # 선공개수, 후공개수

for x in range(3):
    for y in range(3):
        if board[x][y] == 'O': first+=1
        elif board[x][y] == 'X': second+=1

if first != second and first != second+1: return 0
if first == 0 and second == 0: return 1
🌹 입출력 예제 4번 처럼 O과 X가 모두 없을 때에는 반드시 가능하므로 1을 반환해주어아 합니다.

 

2.2 O가 이긴 상황일 때

O가 가로, 세로, 대각선 중 이미 3개를 모두 채운 경우에는 어떨때 불가능한 경우일까요?

O가 이긴 상황에서 X는 새로운 칸을 채울 수 없습니다. 따라서 O가 이겼을 때는 X의 개수가 O보다 크거나 같으면 안 됩니다.

# count_O는 하나의 가로,세로,대각선에서 O의 개수
if count_O == 3 and first <= second: return 0

 

2.3 X가 이긴 상황일 때

X가 가로, 세로, 대각선 중 이미 3개를 모두 채운 경우에는 O와 비슷하게 O의 개수가 X의 개수와 같아야 합니다.

X가 이긴 상황에서 O는 새로운 칸을 채울 수 없기 때문입니다.

# count_X는 하나의 가로, 세로, 대각선에서의 X의 개수
if count_X == 3 and first > second: return 0

 

위 3가지 경우를 코드롤 구현하면 아래와 같습니다. 🤗

3. 코드

Python
def solution(board):
    first, second = 0, 0 # 선공개수, 후공개수
    
    for x in range(3):
        for y in range(3):
            if board[x][y] == 'O': first+=1
            elif board[x][y] == 'X': second+=1
    
    if first != second and first != second+1: return 0
    if first == 0 and second == 0: return 1
    
    # row
    for x in range(3):
        count_O, count_X = 0, 0
        for y in range(3):
            if board[x][y] == 'O': count_O+=1
            elif board[x][y] == 'X': count_X+=1
        if count_O == 3 and first <= second: return 0
        if count_X == 3 and first > second: return 0

    # Column
    for x in range(3):
        count_O, count_X = 0, 0
        for y in range(3):
            if board[y][x] == 'O': count_O+=1
            elif board[y][x] == 'X': count_X+=1
        if count_O == 3 and first <= second: return 0
        if count_X == 3 and first > second: return 0
    
    # Dia
    count_O, count_X = 0, 0
    for x in range(3):
        if board[x][x] == 'O': count_O+=1
        elif board[x][x] == 'X': count_X+=1
    if count_O == 3 and first <= second: return 0
    if count_X == 3 and first > second: return 0

    count_O, count_X = 0, 0
    for x in range(3):
        if board[x][-x-1] == 'O': count_O+=1
        elif board[x][-x-1] == 'X': count_X+=1
    if count_O == 3 and first <= second: return 0
    if count_X == 3 and first > second: return 0

    return 1

 

 

반응형