practivceAlgorithm/codeforce

[codeforce][Python] #719 E.Arranging The Sheep

findTheValue 2021. 10. 17. 18:59

좌우에 양이 얼마나 있냐? 마지막 양으로부터 얼마나떨어져있냐? 의 곱을 빈칸마다 계산해

한 빈칸 dection에서 최솟값을 구해 계산해줌

 

import sys
input = sys.stdin.readline

for test in range(int(input())):
    n = int(input())
    arr = list(input().rstrip()) + ['.']
    dp = [[0, 0] for _ in range(n + 1)]
    last_sheep = -1
    cnt = 0
    for i in range(n + 1):
        if arr[i] == '*':
            last_sheep = i
            cnt += 1
        else:
            if last_sheep != -1:
                dp[i][0] = cnt * (i - last_sheep)
    last_sheep = -1
    cnt = 0
    for i in range(n, -1, -1):
        if arr[i] == '*':
            last_sheep = i
            cnt += 1
        else:
            if last_sheep != -1:
                dp[i][1] = (last_sheep - i) * cnt
    answer = 0
    min_value = float('inf')
    for i in range(n + 1):
        if dp[i][0] and dp[i][1]:
            min_value = min(min_value, dp[i][0] + dp[i + 1][1], dp[i][1] + dp[i - 1][0])
        elif not dp[i][0] and not dp[i][1] and min_value != float('inf'):
            answer += min_value
            min_value = float('inf')
    print(answer)