올바른 배열

거의 처음 풀어본 투포인터 문제다. 개념은 알고 있었는데, 막상 구현하려 하니 수월하게 되지는 않았다.

CODE

import sys
read=sys.stdin.readline

n=int(read())
num=list(int(read()) for _ in range(n))
num.sort()

cnt=1
for i in range(n-1):
    for j in range(i+1,n):
        if num[j]-num[i]>=5:break
        cnt=max(j-i+1,cnt)

if cnt>4: print(0)
else: print(5-cnt)


귀여운 라이언

앞에서 푼 투포인터 문제보다 시간이 배로 걸렸다. 다음주 까지 투포인터 문제도 집중적으로 풀어봐야겠다. 풀긴 풀었는데 코드가 이상하게 길고, 조금 비효율적인 것 같다.

CODE

import sys
read=sys.stdin.readline

n,k=map(int,read().split())
if k ==0:
    print(0)
    sys.exit()
num=list(map(int,read().split()))

l,r,cnt=0,0,0

for i in range(n):
    if num[i]==1:
        l=i
        break
tmp=0
for i in range(i,n+1):
    if i == n:
        print(-1)
        sys.exit()
    if num[i]==1: tmp+=1
    if tmp==k:
        r=i
        break

answer=r-l+1
flag=1
while flag==1:
    for i in range(l+1,n):
        if num[i]==1:
            l=i
            break
    for i in range(r+1,n+1):
        if i == n:
            flag=2
            break
        if num[i]==1:
            r=i
            break
    if flag==1: answer=min(answer,r-l+1)

if answer < 2147000000:
    print(answer)
else: print(-1)


풀어야 할 문제

  • 스타트 택시
  • 미네랄
  • 회전 초밥
  • 아기 상어
  • 전깃줄 -2
  • 치즈