[코드트리 파이썬] 팀으로 하는 틱택토

문제


풀이

일반적인 틱택토이지만 2개의 숫자가 한팀이 되었을 때만 이긴걸로 간주한다.

즉 1 1 1 과 같이 한 숫자로만 이루어진 줄은 이긴걸로 간주되지 않는다.

틱택토는 항상 3X3의 배열이므로 이를 이용하여 문제를 해결하였다.

 

team = set()
for i in range(3):
    tmp = set()
    for j in range(3):
        tmp.add(graph[i][j])
    
    if len(tmp) == 2:
        team.add(tuple(sorted(graph[i])))

배열의 가로를 검사하는 코드이다.

3X3배열에서 두 숫자가 팀이되어서 이길 경우는 한 줄에 2개의 숫자만 있으면 된다.

따라서 set자료형을 이용하여 중복을 제거했을 때 길이가 2개일 경우

tuple로 정렬된 줄을 team에 넣는다

 

 

for i in range(3):
    tmp = set()
    for j in range(3):
        tmp.add(graph[j][i])
    if len(tmp) == 2:
        team.add(tuple(sorted([graph[0][i], graph[1][i], graph[2][i]])))

배열의 세로를 검사하는 코드이다.

위와 마찬가지로 숫자가 2개인 경우 team에 넣어준다.

mp = set()
for i in range(3):
    tmp.add(graph[i][i])
if len(tmp) == 2:
    team.add(tuple(sorted([graph[0][0], graph[1][1], graph[2][2]])))

    
tmp = set()
tmp.add(graph[0][2])
tmp.add(graph[1][1])
tmp.add(graph[2][0])
if len(tmp) == 2:
    team.add(tuple(sorted([graph[0][2], graph[1][1], graph[2][0]])))

양쪽 대각선도 마찬가지로 검사해준다.

 

이긴 횟수를 구하는 것이 아니라. 이길 수 있는 팀의 개수를 구하는 문제이므로 team을 set자료형으로 구현해 중복을 제거해주었다.

 

 

코드


graph = [list(map(int, input())) for _ in range(3)]

res = 0
team = set()
for i in range(3):
    tmp = set()
    for j in range(3):
        tmp.add(graph[i][j])
    
    if len(tmp) == 2:
        team.add(tuple(sorted(graph[i])))
     


for i in range(3):
    tmp = set()
    for j in range(3):
        tmp.add(graph[j][i])
    if len(tmp) == 2:
        team.add(tuple(sorted([graph[0][i], graph[1][i], graph[2][i]])))

tmp = set()
for i in range(3):
    tmp.add(graph[i][i])
if len(tmp) == 2:
    team.add(tuple(sorted([graph[0][0], graph[1][1], graph[2][2]])))

    
tmp = set()
tmp.add(graph[0][2])
tmp.add(graph[1][1])
tmp.add(graph[2][0])
if len(tmp) == 2:
    team.add(tuple(sorted([graph[0][2], graph[1][1], graph[2][0]])))

print(len(team))