-
7682. [Python]틱택토Python_알고리즘/Gold V 2024. 4. 17. 21:08
1. 문제
https://www.acmicpc.net/problem/7682
7682번: 틱택토
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고
www.acmicpc.net
2. 접근 방법
- 시간 제한: 1초
- 메모리 제한: 128MB
- 구현
3. 파이썬 코드
while True: game = input() if game == "end": break game = list(map(str,game)) circle = game.count("O") cross = game.count("X") dot = game.count(".") if circle > cross: print("invalid") else: if cross - circle > 1: print("invalid") else: matrix = [ game[:3], game[3:6], game[6:]] for i in range(3): cross_flag = 0 circle_flag = 0 cross_check = 0 circle_check = 0 # 대각 선 범위 체크 if i == 0: if matrix[i][0] == "X": if matrix[i+1][1] == "X": if matrix[i+2][2] == "X": cross_flag = 1 elif matrix[i][0] == "O": if matrix[i+1][1] == "O": if matrix[i+2][2] == "O": circle_flag = 1 if matrix[i][2] == "X": if matrix[i+1][1] == "X": if matrix[i+2][0] == "X": cross_flag = 1 elif matrix[i][2] == "O": if matrix[i+1][1] == "O": if matrix[i+2][0] == "O": circle_flag = 1 if matrix[i][0] == "X": if matrix[i+1][0] == "X": if matrix[i+2][0] == "X": cross_flag = 1 elif matrix[i][0] == "O": if matrix[i+1][0] == "O": if matrix[i+2][0] == "O": circle_flag = 1 if matrix[i][1] == "X": if matrix[i+1][1] == "X": if matrix[i+2][1] == "X": cross_flag = 1 elif matrix[i][1] == "O": if matrix[i+1][1] == "O": if matrix[i+2][1] == "O": circle_flag = 1 if matrix[i][2] == "X": if matrix[i+1][2] == "X": if matrix[i+2][2] == "X": cross_flag = 1 elif matrix[i][2] == "O": if matrix[i+1][2] == "O": if matrix[i+2][2] == "O": circle_flag = 1 # 가로 개수 체크 for j in range(3): circle_check = matrix[j].count("O") cross_check = matrix[j].count("X") if circle_check == 3: circle_flag = 1 if cross_check == 3: cross_flag = 1 # X 빙고일 경우 O 빙고가 있는지 체크 if cross_flag == 1: if circle_flag != 1: # X 빙고의 경우 O의 개수가 작아야 하는거 체크 if cross > circle: print("valid") else: print("invalid") else: print("invalid") break # O 빙고의 경우 X 빙고가 있는지 체크 if circle_flag == 1: if cross_flag != 1: # O 빙고의 경우 꽉차있는 경우 나올 수 없으므로 체크 if dot == 0: print("invalid") else: # 꽉 차있지 않는 경우 X와 O의 개수가 같아야 하기 떄문에 체크 if cross == circle: print("valid") else: print("invalid") else: print("invalid") break else: # 모든 경우를 통과했을때 꽉 차있는지 체크 if dot == 0: if cross == 5 and circle == 4: print("valid") continue print("invalid")
4. 문제를 풀고난 후 생각
- 구현 문제라서 별다른 설명이 없다.
- 나올 수 있는 경우의 수를 모두 제거하는 방식으로 코드를 구현함.
- X 빙고의 경우 O 의 빙고가 있는지, X의 개수가 O의 개수보다 많은지
- O 빙고의 경우 X 의 빙고가 있는지, O의 개수가 X의 개수랑 같은지
- 모든 경우를 통과했을때 X의 개수가 5개 O 의 개수가 4개 등 나올 수 있는 모든 경우를 제거함
5. 문제를 푸는데 도움이 되는 지식
- 구현
'Python_알고리즘 > Gold V' 카테고리의 다른 글
14284. [Python]간선 이어가기 2 (0) 2024.05.08 7569. [Python]토마토 (0) 2024.04.25 1456. [Python]거의 소수 (0) 2024.04.14 1916. [Python]최소비용 구하기 (1) 2024.03.05 2023. [Python] 신기한 소수 (1) 2024.02.25