코딩테스트 연습/프로그래머스

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

슈퍼짱짱 2023. 7. 7. 10:18
반응형

파이썬으로 코딩테스트 연습하기

 

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

 

프로그래머스

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

programmers.co.kr

 


Solution

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import re
 
def findOX(board, pattern) :
    '''
    count O or X in board
    pattern : "O" or "X"
    '''
    return sum([len(re.findall(pattern, i)) for i in board])
 
def isEnd(board, pattern) :
    '''
    종료가 가능한 경우의 수 return
    pattern : "O" or "X"
    '''
    rows = dict() # OOO 확인
    for j in range(3) :
        rows[j] = [i for i in range(3if board[j][i] == pattern]
        
    rowEnd = sum([1 for i in range(3if len(rows[i])==3])
    colEnd = sum([1 for i in range(3if (i in rows[0]) & (i in rows[1]) & (i in rows[2])])
    crossEnd = (sum([1 for i in range(3if i in rows[i]]) == 3+ (sum([1 for i in range(3if (2-i) in rows[i]]) == 3)
    
    return([rowEnd, colEnd, crossEnd])
 
def solution(board) :
    Ocnt = findOX(board, "O")
    Xcnt = findOX(board, "X")
 
    Oend = isEnd(board, "O")
    Xend = isEnd(board, "X")
    
    if (Ocnt - Xcnt < 0| (Ocnt - Xcnt > 1) :
        return(0)
    elif (Oend[0> 1or (Oend[1> 1or (Xend[0> 1or (Xend[1> 1) :
        return(0)
    elif (sum(Oend)>=1& (Ocnt <= Xcnt) :
        return(0)
    elif (sum(Xend)>=1& (Ocnt != Xcnt) :
        return(0)
    else :
        return(1)
cs

 

이 문제는 나올 수 없는 경우의 수를 잘 정의하는 것이 핵심이다.

 

1. "O"가 선공, "X"가 후공이므로 보드에서 ("O"의 개수) - ("X"의 개수) 는 1보다 작거나 같아야 하며, "X
의 개수가 더 많으면 안된다.

 

2. row나 col만은 여러번 성공할 수 없다.

즉, 아래 이미지처럼 대각선이 아니라 직선 형태로는 한 번 성공하면 그대로 종료이다.

 

단, 아래와 같이 row + 대각선, col + 대각선, 대각선 + 대각선 형태는 중복 성공이 가능하다.

 

왜나면 아래와 같이 겹치는 Cell을 가장 마지막에 놓는 경우엔 중복이어도 승리할 수 있기 때문이다.

 

3. "O"가 승리했을 땐 "O"의 개수가 "X"의 개수보다 딱 한개 더 많아야 한다.("O"가 선공이므로)

 

4. "X"가 승리했을 땐 "O"의 개수와 "X"의 개수가 일치해야한다.("X"가 후공이므로)

 

 

위 코드에서 findOX()는 보드에서 O 또는 X의 개수를 return해주고,

isEnd()는 입력해준 pattern(O or X)이 row로 승리한 개수, col로 승리한 개수, 대각선으로 승리한 개수를 list형태로 return한다.

  

반응형