[백준 BOJ_3085] 사탕 게임 Python 풀이

출처: 백준 온라인 저지

문제

image image

풀이

브루트 포스로 모든 경우의 수를 체크해주었습니다.

이론은 간단합니다. 서로 다른 swap 가능한 두 수를 찾아 swap해주고, check함수로 가장 긴 연속 부분을 구해준 뒤 result를 update해주었습니다.

처음에 check함수에서 y값을 따로 안정해주고 다 돌아주었더니 timeout이 나서 y값이 변했을 때는 변한 행만, x값이 변했을 때는 변한 열만 체크해주면 되기 때문에 변한 행과 열만 체크해주니 통과하게 됐습니다.

코드

N = int(input())
board = [list(input()) for _ in range(N)]

dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]

def check(board, i, y, x):
    result = 0
    if dy[i]: # y-1, y+1
        # 행 체크
        for i in [-1, 1]:
            if 0 <= y + i < N:
                prev = board[y + i][0]
                prev_i = 0
                for j in range(N):
                    if prev != board[y + i][j]:
                        prev = board[y + i][j]
                        result = max(result, j - prev_i)
                        prev_i = j
                result = max(result, N - prev_i)

        # 열 체크
        prev = board[x][0]
        prev_i = 0
        for j in range(N):
            if prev != board[j][x]:
                prev = board[j][x]
                result = max(result, j - prev_i)
                prev_i = j
        result = max(result, N - prev_i)
    else: # x-1, x+1
        # 행 체크
        prev = board[y][0]
        prev_i = 0
        for j in range(N):
            if prev != board[y][j]:
                prev = board[y][j]
                result = max(result, j - prev_i)
                prev_i = j
        result = max(result, N - prev_i)
        # 열 체크
        for i in [-1, 1]:
            if 0 <= x + i < N:
                prev = board[0][x+i]
                prev_i = 0
                for j in range(N):
                    if prev != board[j][x+i]:
                        prev = board[j][x+i]
                        result = max(result, j - prev_i)
                        prev_i = j
                result = max(result, N - prev_i)

    return result

result = 0

for y in range(N):
    if result == N:
            break
    for x in range(N):
        if result == N:
            break
        for i in range(4):
            ny = y + dy[i]
            nx = x + dx[i]
            if 0 <= ny < N and 0 <= nx < N and board[y][x] != board[ny][nx]:
                # swap
                board[y][x], board[ny][nx] = board[ny][nx], board[y][x]
                result = max(result, check(board, i, y, x))
                # swap back
                board[y][x], board[ny][nx] = board[ny][nx], board[y][x]

print(result)

Leave a comment