첫번째 시도
개인적으로 이 문제가 어려웠던 이유는 게임이 끝나고 승부를 판단하는 게 아니라 입력이 될 때 누가 언제 이기는지 알아내야 하기 때문에 헤맸다. 만약에 승부만 판단하는 문제였다면, 플레이어 1과 2가 했던 게임을 입력 받고 승부 조건만 확인하면 되기 때문이다. 그래서 처음에는 이렇게만 이해하고 다음과 같이 코드를 작성했다.
# 먼저 시작하는 사람
n = int(input())
g = [[' ']*3 for _ in range(3)]
for i in range(9):
r,c = map(int, input().split())
# 게임판
if i % 2 == 0: g[r-1][c-1] = 'X'
else: g[r-1][c-1] = 'O'
# 승부 확인을 위해서 새로운 배열에 대입.
res = []
for i in range(3):
res.append([g[i][0], g[i][1], g[i][2]])
for i in range(3):
res.append([g[0][i], g[1][i], g[2][i]])
res.append([g[0][0], g[1][1], g[2][2]])
res.append([g[0][2], g[1][1], g[2][0]])
if ['O', 'O', 'O'] in res: winner = 1
if ['X', 'X', 'X'] in res: winner = 2
# 비겼을 때
if winner == 0:
flag = False # 공백 확인
for i in range(len(res)):
if ' ' in res[i]: flag = True
# 공백이 없고 승부가 안나면 무승부
if not flag : winner = 3
print(winner)
다 작성하고 나니까 player가 번갈아 가면서 게임을 하는 내용도 없고,, 단순히 확인만 했던 거였다.
따라서 내 코드에 보완할 점은
1. player들이 번갈아 가면서 게임을 진행한다.
2. 공정하고 자비없는 심판 = 입력을 받으면서 승부를 체크하고, 누가 언제이기는지 출력.
최종 코드
- while문을 이용해서 입력값을 받다가 게임이 끝나면 break문을 통해 반복문을 탈출한다.
- 게임이 끝나는 유무는 winner 변수를 통해 결정한다.
- 매 턴 마다 바뀌는 player 값을 if / else 문을 통해 지정해준다
game = [[' '] * 3 for _ in range(3)]
player = int(input())
while 1:
x, y = map(int,input().split())
x-=1
y-=1
winner = 0
# 게임판
if player == 1: game[x][y] = 'O'
else: game[x][y] = 'X'
# 승부 확인을 위해 새로운 배열에 대입.
res = []
for i in range(3):
res.append([game[i][0], game[i][1], game[i][2]])
for i in range(3):
res.append([game[0][i], game[1][i], game[2][i]])
res.append([game[0][0], game[1][1], game[2][2]])
res.append([game[0][2], game[1][1], game[2][0]])
if ['O', 'O', 'O'] in res: winner = 1
if ['X', 'X', 'X'] in res: winner = 2
# 비겼는지 아닌지 확인(공백이 없고 winner가 결정이 안되면 무승부.)
if winner == 0:
flag = False
for i in range(len(res)):
if ' ' in res[i]: flag = True
if not flag: winner = 3
if winner > 0: break
# 턴 넘기기
if player == 1: player = 2
else: player = 1
if winner < 3: print(winner)
else: print(0)
알게된 점
처음으로 player들이 번갈아 가면서 게임 하는 것을 구현해봤는데, 처음이라 그런지 세심한 아이디어가 많이 부족했다.
대각선 값을 확인하기 위해서 새로운 배열을 선언해서 가로측으로 바꾸어주는 것.
- flag를 활용한 리스트 공백 확인법
- player들의 턴 넘기는 법 if / else
- while 문..... break를 좀 더 수준 높게 활용
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/14592] 2017 아주대학교 프로그래밍 경시대회(small) - 파이썬 (2) | 2023.01.18 |
---|---|
[백준/13424] Three Dots / 완전탐색 - 파이썬 (0) | 2023.01.17 |
[백준/1100] 하얀 칸 | 파이썬 2차원 리스트 (0) | 2023.01.16 |
[백준/11652] 카드 - 파이썬 (0) | 2023.01.14 |
[백준/14582] 오늘도 졌다 | 야구 | 파이썬 리스트 누적합 (0) | 2023.01.14 |