B. Partial Replacement | Round #710 Div.3

LONGNEW·2021년 8월 9일
0

CP

목록 보기
74/155

https://codeforces.com/contest/1506/problem/B
시간 2초, 메모리 256MB

input :

  • t (1 ≤ t ≤ 500)
  • n k(1 ≤ k ≤ n ≤ 50)
  • string s of length n

output :

  • For each test case output the minimum number of '*' characters that must be replaced with 'x' characters in order to satisfy the conditions above.
    각 테스트 케이스에서 필요한 최소한의 '*'의 개수를 출력하시오.

조건 :

  • You are given a number k and a string s of length n, consisting of the characters '.' and '*'. You want to replace some of the '*' characters with 'x' characters so that the following conditions are met:
    The first character '*' in the original string should be replaced with 'x';
    The last character '*' in the original string should be replaced with 'x';
    The distance between two neighboring replaced characters 'x' must not exceed k (more formally, if you replaced characters at positions i and j (i<j) and at positions [i+1,j−1] there is no "x" symbol, then j−i must be no more than k).
    k와 n길이의 문자열 s가 입력 됩니다. 이 문장은 '.'과 '*'로 이루어져 있습니다. 몇 개의 '*'를 'x'로 바꾸려고 합니다. 첫 번째 '*'은 'x'로 바뀌어야 합니다. 마지막 '*'은 'x'로 바뀌어야 합니다. 이웃하는 'x' 사이의 거리는 k를 넘어서는 안됩니다.(k까지는 okay)

조건이 좀 많은데 가장 중요한 것은 양 끝을 포함한다는 것이다.

이 부분에서 예외가 발생할 수 있다.

기본적으로 생각한 것은 이것이다.
'*'의 위치를 다 모은 다음에 k를 초과하는 별에서 그 이전 별을 추가한다. 이를 끝까지 반복하고 마지막에 위치하는 별이 마지막 별이 아닌 경우에는 마지막 별도 x로 바꾸도록 한다.

이 것을 리스트에 모두 저장을 한 다음에(인덱스를) 현재 가장 마지막에 추가한 x의 거리 차이를 계산하면서 반복을 하는 것이다.

import sys

for _ in range(int(sys.stdin.readline())):
    n, k = map(int, sys.stdin.readline().split())
    data = list(sys.stdin.readline().rstrip())
    stars = []

    for idx, item in enumerate(data):
        if item == '*':
            stars.append(idx)

    if len(stars) == 1:
        print(1)
        continue

    ans, now = 1, stars[0]

    for i in range(1, len(stars)):
        if now + k < stars[i]:
            ans += 1
            now = stars[i - 1]

    print(ans if now == stars[-1] else ans + 1)

0개의 댓글