본문 바로가기

알고리즘 문제 풀이/Baekjoon

7682 - 틱택토 (구현)

반응형
SMALL

https://www.acmicpc.net/problem/7682

 

7682번: 틱택토

틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고

www.acmicpc.net

 

일 하면서 단계적인 생각을 하는 경우가 많은데, 이럴 때마다 문제를 접근하는 방법이 중요하다고 느낌

 

몸은 여기 앉아 있는데, 정신은 다른 곳에 가 있으면 문제가 많은 코드를 만들 수 밖에 없는데, 요새 들어 논리적 생각을 할 때, 이런 경우가 몇 번 있어서 훈련을 해야겠더라.

 

그래서 선택한건 다시 백준 문제 하나씩 푸는 것

 

쉬운 문제라도 논리적인 생각을 자주 하는 것이 중요하기에 차근차근 다시 시작하려함 (뭐 또 이러다 말겠지)

 

그래서 선택한 문제가 틱택토인데,

 

쉬운 문제인데 푸는데 1시간 30분 정도 걸림

 

확실히 생각하는 머리가 굳음 ;;

 

흑흑

 

그래서 블로그로 다시 정리하려고 키보드 잡음, 단계별로 진행하자


목적 : 주어진 문자열이 틱택토 게임에서 나타날 수 있는 상태인지 확인

 

접근 방법 : X의 승 / O의 승 / 무승부 경우 어떻게 결과가 나타날 수 있는지 생각

 

단계 1: X가 항상 먼저 시작하니, 정상적인 게임에선 X가 O보다 항상 1개 더 많거나 같다. (X >= O + 1)

    단계 1-1: O가 이긴 경우 X == O / X가 이긴 경우 X == O + 1

단계 2: 무승부인 경우 빈 칸이 없다.

   단계 2-1: 무승부인 경우는 한 줄을 차지하는 X와 O가 하나도 없다는 뜻 (이 경우도 정상적인 게임이니 X가 O보다 1개 더 많다)

 

큰 줄기는 위와 같은데, 추가적으로 필요한 것들은 X / O / .(빈 칸)의 갯수X / O 빙고 갯수 정도가 있겠다.

 

드가자

 

def win_chk(sy, sx, paths, game):
    OX = game[sy][sx]
    x_win = 0
    o_win = 0

    if OX == '.':
        return x_win, o_win

    for path in paths:
        dy, dx, cnt = sy, sx, 1

        while 0 <= dy + path[0] < 3 and 0 <= dx + path[1] < 3 and OX == game[dy + path[0]][dx + path[1]]:
            cnt += 1
            dy += path[0]
            dx += path[1]

        if cnt == 3:
            if OX == 'O':
                o_win += 1
            elif OX == 'X':
                x_win += 1

    return x_win, o_win

start_points = [[0, 0], [0, 1], [0, 2], [1, 0], [2, 0]]
paths = [
    [[0, 1], [1, 1], [1, 0]],
    [[1, 0]],
    [[1, -1], [1, 0]],
    [[0, 1]],
    [[0, 1]]
]

while True:
    inp = input()
    
    if inp == 'end':
        break

    game = []
    tmp = []
    
    for i in range(1, 10):
        tmp.append(inp[i - 1])
        if (i % 3 == 0):
            game.append(tmp)
            tmp = []

    x_win = 0
    o_win = 0

    for index in range(len(start_points)):
        dx_win, do_win = win_chk(start_points[index][0], start_points[index][1], paths[index], game)
        x_win += dx_win
        o_win += do_win
    
    x_cnt = inp.count('X')
    o_cnt = inp.count('O')
    d_cnt = inp.count('.')

    if x_win > o_win and x_cnt == o_cnt + 1:
        print('valid')
        continue

    if o_win > x_win and x_cnt == o_cnt:
        print('valid')
        continue

    if o_win == x_win == 0 and d_cnt == 0 and x_cnt == o_cnt + 1:
        print('valid')
        continue

    print('invalid')

맥북이라 C를 못 돌려서, Python으로 풀었다.

 

생각해보니 JS로 풀어도 되는데, 어떻게 인풋 받는지 몰라서 헤헤헿ㅎㅎ헤헤헿ㅎㅎ;;

 

이 문제가 딱 녹슨 머리를 움직이게 하는데, 좋은 문제였던거 같다.

녹슨 머리를 가동시키는데, 희생한 채점 컴퓨터

나이 30 가까워지니, 생각하는것도 지쳐서 생각을 잘 안하게 되는 경우가 많은데, 운동도 많이 하고 !! 생각도 많이 하고 !! 좋은 코드를 낳도록 하자

 

전부 내 새낀데, 내 새끼 어디가서 욕 먹으면, 내가 슬프잖앙.. ㅠㅠ

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

2550 - 전구  (7) 2021.09.12
12865 - 평범한 배낭  (8) 2021.09.05
15683 - 감시  (0) 2021.04.13
14501 - 퇴사  (4) 2021.04.13
20055 - 컨베이어 벨트 위의 로봇  (2) 2021.04.12