백준 - 틱택토

김서영·2024년 4월 9일
0

알고리즘

목록 보기
19/25

📃 문제

💟 코드

# 백준 7682 틱택토

# 꽉 차있는지...
# o이 x보다 많으면 안되고..
# 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공
# 게임판이 가득 찼을 때

while True:
    game = input()
    if game == "end":
        break
    else:
        lst = [game[0:3], game[3:6], game[6:9]] # lst에 가로, 세로, 대각선 모든 경우를 넣는다.
        for i in range(3):
            word = ''
            for j in range(3):
                word += lst[j][i]
            lst.append(word)
        lst.append(lst[0][0] + lst[1][1] + lst[2][2])
        lst.append(lst[0][2] + lst[1][1] + lst[2][0])
        if '.' in game: # 게임판에 빈 칸이 있는 경우
            if game.count('X') == game.count('O'): # O을 마지막에 냈을 경우
                if lst.count('OOO') > 1 or lst.count('XXX') > 1: # 3칸을 잇는 경우가 여러개일 경우 끝나야 하는데 끝나지 않았기 때문에
                    print('invalid')
                elif lst.count('XXX') == 1:
                    print('invalid')
                elif lst.count('OOO') == 1:
                    print('valid')
                else:
                    print('invalid')
            elif game.count('X') == game.count('O') + 1: # x를 마지막에 낸 경우
                if lst.count('OOO') > 1 or lst.count('XXX') > 1: # 3칸을 잇는 경우가 여러개일 경우 끝나야 하는데 끝나지 않았기 때문에
                    print('invalid')
                elif lst.count('OOO') == 1: # x를 마지막에 냈지만 이미 o 3칸이 존재하면 invalid
                    print('invalid')
                elif lst.count('XXX') == 1: # x를 마지막에 내고 x 3칸이 1개 존재할 경우
                    print('valid')
                else:
                    print('invalid')
            else: # 아무도 안 냈을 경우
                print('invalid')
        else: # 게임판이 꽉 찬 경우
            if game.count('X') == 5 and game.count('O') == 4:
                if lst.count('OOO') == 1: # 게임판 꽉 차있을 때 'O'가 이기는 경우 invalid
                    print('invalid')
                else:
                    print('valid')
            else:
                print('invalid')

✨ 코드 풀이

게임이 끝나는 경우는

  1. 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공
  2. 게임판이 가득 찼을 때

이 2가지 경우이다.

그래서 먼저 lst에 주어진 게임판의 가로,세로, 대각선의 값을 모두 넣어놓았다.
그 후 게임판이 꽉 찬 경우와, 그렇지 않은 경우로 나누어
1. 게임판이 꽉 찬 경우

  • X가 5개, O가 4개인지 확인
  • X가 5개, O가 4개일 때 게임판이 꽉 찼을 때 O가 이기는 경우

이 2개의 경우를 확인해 주었고
2. 게임판이 꽉 차지 않은 경우

  • O을 마지막에 낸 경우와 X를 마지막에 낸 경우로 나누어
    - 그 안에서 OOO이나 XXX의 경우가 2개 이상인 경우
    - XXX와 OOO이 1개 존재하는 경우
    - 아무것도 존재하지 않는 경우

를 확인해 주었다.

조건이 생각보다 복잡해 이해하는데에 오래 걸렸지만 조건을 잘 이해하고 작성한다면 그렇게 어렵지는 않은 문제였던 것 같다!

profile
개발과 지식의 성장을 즐기는 개발자

0개의 댓글