https://www.acmicpc.net/problem/15565
15565번: 귀여운 라이언
꿀귀 라이언 인형과, 마찬가지로 꿀귀인 어피치 인형이 N개 일렬로 놓여 있다. 라이언 인형은 1, 어피치 인형은 2로 표현하자. 라이언 인형이 K개 이상 있는 가장 작은 연속된 인형들의 집합의
www.acmicpc.net
풀이 과정
- 결국 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 |