https://www.acmicpc.net/problem/15565
풀이 과정
- 결국 1의 개수가 연속으로 딱 K개가 될 때중 하나가 가장 작은 연속된 인형들의 집합이다.
- 따라서, 1의 위치들만 저장해둔 리스트들을 따로 만들어 둔다.
- 1의 개수가 K개도 안된다면 애초에 불가능한 것이므로 -1 출력후 종료
- 맨 앞에서부터 K개를 선택한다. => left는 0, right는 K-1이다.
- 이 때, 인형의 개수는 리스트[right] - 리스트[left] + 1이므로, 이 값으로 최소 인형의 개수를 갱신해 준다.
- 이후 한칸 옮겨서 left = left + 1, right = right + 1 해준다.
- right가 배열의 끝까지 가게 되면 종료시켜 준다.
- 최소 인형의 개수를 출력해 준다.
- 초기에는 막코딩 했는데 소스가 너무 지저분하고 이해하기 어려워서 맞았으나 다시 짬..
import sys
input = lambda :sys.stdin.readline().rstrip()
N, K = map(int, input().split())
dolls = list(map(int, input().split()))
answer = int(10e9)
lion_pos = []
for i in range(len(dolls)):
if dolls[i] == 1:
lion_pos.append(i)
left = 0
right = K-1
if len(lion_pos) < K:
print(-1)
else:
while right < len(lion_pos):
answer = min(answer, lion_pos[right] - lion_pos[left] + 1)
left, right = left+1, right+1
print(answer)
이전 소스
- K개 맞추어 줄려고 매순간 값 갱신 이후에 left 1 증가시키고 lion 1 빼줌
import sys
input = lambda :sys.stdin.readline().rstrip()
N, K = map(int, input().split())
dolls = list(map(int, input().split()))
answer = int(10e9)
left = 0
right = 0
lion = 1 if dolls[0] == 1 else 0
while True:
while right < len(dolls)-1 and lion < K:
right += 1
lion = lion + 1 if dolls[right] == 1 else lion
while left < right and lion >= K:
if dolls[left] == 1:
if lion == K:
break
else:
lion -= 1
left += 1
if lion >= K:
answer = min(answer, right-left+1)
left += 1
lion -= 1
if right == len(dolls)-1:
break
if answer == int(10e9):
print(-1)
else:
print(answer)
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 21921 ] [ Two-Pointer] 블로그 (0) | 2021.09.16 |
---|---|
[ 3687 ] [ DP, BFS ] 성냥개비 (0) | 2021.09.14 |
[ 15961 ] [ Two-Pointer ] 회전 초밥 (0) | 2021.09.14 |
[ 19637 ] [ Binary-Search ] IF문 좀 대신 써줘 (0) | 2021.09.12 |
[ 2670 ] [ DP ] 연속부분최대곱 (0) | 2021.09.12 |