문제
풀이
일반적인 틱택토이지만 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))
'알고리즘' 카테고리의 다른 글
[코드트리 파이썬] 바구니 안의 사탕 (0) | 2024.03.28 |
---|---|
[코드트리 파이썬] 가장 짧은 부분합 (1) | 2024.03.25 |
[코드트리 파이썬] 우리는 하나 (0) | 2024.03.18 |
[코드트리 파이썬] 이동경로상에 있는 모든 숫자 더하기 (4) | 2024.03.16 |
[코드트리 파이썬] 뿌요뿌요 (0) | 2024.03.14 |