![[BOJ] 백준 7682 틱택토 Python](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdC8kar%2FbtsC4vt0VEg%2Ffh6KAA0S7aAHkipnDqcWG1%2Fimg.png)
[BOJ] 백준 7682 틱택토 Python알고리즘 & 코테2024. 1. 3. 20:04
Table of Contents
7682번: 틱택토
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고
www.acmicpc.net
문제
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고 두 번째 사람이 O를 놓는다. 어느 때든지 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공하면 게임은 즉시 끝난다. 게임판이 가득 차도 게임은 끝난다.게임판의 상태가 주어지면, 그 상태가 틱택토 게임에서 발생할 수 있는 최종 상태인지를 판별하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입력의 마지막에는 문자열 "end"가 주어진다.
출력
각 테스트 케이스마다 한 줄에 정답을 출력한다. 가능할 경우 "valid", 불가능할 경우 "invalid"를 출력한다.
문제풀이
먼저 시간복잡도를 생각해봤을 때 별로 중요하지 않아 주어진 상황에 대한 모든 케이스를 해결할 수 있는 일반적인 코드를 작성하는 것이 중요하다고 생각했다.
불가능한 경우에 대해서 적고 나머지는 가능하다고 논리를 진행시켰다. 다음은 불가능한 경우의 case들이다.
1. X가 승리하려면 x == o+1 , O가 승리하려면 x == o 이것 외의 나머지것들은 불가능하다.
2. X와 O가 둘다 동시에 승리할때
XO.
XO.
XO.
과 같이 둘 다 동시에 승리하는 것은 불가능하다.
3. 모든 칸이 채워지지 않았는데 게임이 종료되는 경우이다.
XOXO..... 과 같이 말이다. 사실 이런경우는 실제로 일어날리가 거의 없지만 컴퓨터기에... 모든 예외케이스 처리를 해주어야한 다.
4. O가 X보다 먼저 입력되었을때
Code
from sys import stdininput = stdin.readlinedef solve(): while True: case = input().strip() if case == 'end': break x_cnt = case.count('X') o_cnt = case.count('O') if x_cnt == o_cnt + 1 or x_cnt == o_cnt: if x_cnt == o_cnt + 1: _type1, _type2 = ('X', 'O') else: _type1, _type2 = ('O', 'X') game_result1 = check_game_end(case, _type1) game_result2 = check_game_end(case, _type2) if game_result2: print("invalid") elif not game_result1: if case.count('.') == 0: """비겼어도 valid""" print("valid") else: print("invalid") else: print("valid") else: print("invalid")def check_game_end(case, _type): if case[0] == _type and case[0] == case[1] == case[2]: return True elif case[0] == _type and case[0] == case[3] == case[6]: return True elif case[4] == _type and case[1] == case[4] == case[7]: return True elif case[4] == _type and case[3] == case[4] == case[5]: return True elif case[8] == _type and case[6] == case[7] == case[8]: return True elif case[8] == _type and case[2] == case[5] == case[8]: return True elif case[4] == _type and case[0] == case[4] == case[8]: return True elif case[4] == _type and case[2] == case[4] == case[6]: return True else: return Falsesolve()

'알고리즘 & 코테' 카테고리의 다른 글
[BOJ] 백준 5430 AC Python (1) | 2024.01.08 |
---|---|
[BOJ] 백준 2449 전구 Python (1) | 2024.01.06 |
[BOJ] 백준 3977 축구 전술 Python (0) | 2024.01.05 |
[BOJ] 백준 3197 백조의 호수 Python (1) | 2023.12.25 |
[BOJ] 백준 1655 가운데를 말해요 Python (0) | 2023.12.23 |
@Indigochi1d :: Indigochi1d's Commit Log
안녕하세요? 개발자입니다.