โ 15961 ํ์ ์ด๋ฐฅ โ
import sys
input=sys.stdin.readline
from collections import defaultdict
N,d,k,c=map(int,input().split())
kinds=[int(input()) for _ in range(N)]
y,ans,cnt,freq=0,0,0,defaultdict(int)
for x in range(N):
while cnt<k:
if y<N:
cnt+=1
freq[kinds[y]]+=1
y+=1
elif N<=y:
cnt+=1
freq[kinds[(y-1)%(N-1)]]+=1
y+=1
cur_kinds=freq.keys()
if c in cur_kinds:
ans=max(ans,len(cur_kinds))
else:
ans=max(ans,len(cur_kinds)+1)
freq[kinds[x]]-=1
if freq[kinds[x]]==0:
del freq[kinds[x]]
cnt-=1
print(ans)
๐งฆ x์ y ํฌ ํฌ์ธํฐ ๋ชจ๋ ์ฒซ ์ด๋ฐฅ๋ถํฐ ์์ํ๋, k๊ฐ์ ๋ฌถ์๋ง๋ค ์งํํ๋ฏ๋ก(์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํฌ์คํ ์ฐธ์กฐ), x๊ฐ ์ ์ฒด ์ด๋ฐฅ x(1)๋ถํฐ x(8)๊น์ง ์์ง์ผ ๋ y์ ๋์ y(1) ๋ถํฐ y(11)๊น์ง (k=4์ผ ๊ฒฝ์ฐ) ์์ง์ธ๋ค / dictionary ํ์ฉํด freq๋ก ์ข ๋ฅ ๊ฐ์ updateํ๋ฉฐ freq.keys()๋ก ์ค๋ณต ์ด๋ฐฅ ์ฌ๋ถ ๊ฒ์ฌํด c ์ฟ ํฐ ์ฌ์ฉํ๊ฑฐ๋ ์ํ๊ฑฐ๋ ans๊ฐ update (freq dictionary๋ก sushi ์ข ๋ฅ ์์๋ณด๊ธฐ ์๊ฐ ๋จ์ถ)
โ 1806 ๋ถ๋ถํฉ โ
import sys
input=sys.stdin.readline
N,S=map(int,input().split())
ans=100_000
l=list(map(int,input().split()))
cum=0
y=0
length=0
for x in range(N):
while cum<S and y<N:
cum+=l[y]
length+=1
y+=1
if cum>=S:
ans=min(ans,length)
cum-=l[x]
length-=1
if ans == 100_000:
print(0)
else:
print(ans)
๐งฆ x์ y ๋ ํฌ์ธํฐ ๋ชจ๋ ์ผ์ชฝ ๋๋ถํฐ ์์ํ๋ฉฐ, y๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ฉฐ ๋์ ํฉ์ด S์ด์์ด ๋ ๋๊น์ง ์งํ. x๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์, y๊ฐ ์ฒ์๋ถํฐ ์งํํ ํ์ ์์. ๋์ ํฉ์ด๋ฏ๋ก, ๊ธฐ์กด x๊ฐ ๊ฐ๋ฆฌํค๋ ์์๊ฐ ๋น ์ ธ S์ด์์ด ๋ ๋ฆฌ ์๊ธฐ ๋๋ฌธ(ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ). ์๋ ๊ทธ๋ฆผ ์ฐธ์กฐ
: x๊ฐ 5์ผ๋ y๊ฐ 10๊น์ง ์งํ๋์๊ณ (S=15), x๊ฐ ๊ทธ๋ค์ 1๋ก ์งํ๋ ๋, y๊ฐ ๋ค์ 5๋ถํฐ ์ผ์ผ์ด ์งํํ ํ์ ์๋ค. ์ด๋ฏธ ๋ถ๋ถ๋์ ํฉ์ S์ด์์์ ํ์ธํ์๊ณ , ์ฌ๊ธฐ์ 5๋ฅผ ๋บ ํ์ฌ ๋ถ๋ถ๋์ ํฉ์์ ๋ค์ y๊ฐ ์ฒ์๋ถํฐ ์งํํ๋ค๋ฉด S์ด์์ด ๋ ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ(์ด์ x์ผ ๋ y๊ฐ ๋๋ฉด์ ์์ y๋ S์ดํ์์ ์ฆ๋ช ํ์๊ธฐ์) ๋ฐ๋ผ์ x์ y๋ชจ๋ array๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ๊ฐ๊ฐ ํ๋ฒ๋ง ๋๊ธฐ ๋๋ฌธ์ O(N+N)
โ 1644 ์์์ ์ฐ์ํฉ โ
def get_sieve(n):
if n == 1:
return []
elif n == 2:
return [2]
elif n == 3:
return [2,3]
else:
nums=[True]*(n+1)
nums[1]=False
end=int(n**(1/2))
for x in range(2,end+1):
if nums[x]: #if True
for y in range(x,n+1,x):
nums[y]=False
nums[x]=True
return [i for i in range(2,n+1) if nums[i]]
N=int(input())
primality_numbers=get_sieve(N)
l=len(primality_numbers)
y=0
cursum=0
ans=0
for x in range(l):
while y<l and cursum<N:
cursum+=primality_numbers[y]
y+=1
if cursum==N:
ans+=1
cursum-=primality_numbers[x]
print(ans)
๐งฆ ์๋ผํ ์คํ ๋ค์ค ์ฒด๋ก N๊น์ง์ ์์๋ง ๊ตฌ์ฑ๋์ด ์๋ sieve๋ฅผ ๊ตฌํ ๋ค, ์ 1806 ๋ถ๋ถํฉ ๋ฌธ์ ์ ๋์ผํ๊ฒ ๋ถ๋ถ๋์ ํฉ์ด N์ด ๋๋ ์ง ํ์ธ. x๊ฐ ์ฆ๊ฐํ๋ ๊ณผ์ ์์ y๊ฐ 0๋ถํฐ ์ฐจ๋ก๋๋ก ์ ๊ฒํ ํ์ ์์ผ๋ฏ๋ก(ํฌ ํฌ์ธํฐ) ์ฝ๊ฒ O(N+N)
โ 2470 ๋ ์ฉ์ก โ
import sys
input=sys.stdin.readline
N=int(input())
l=list(map(int,input().split()))
l.sort()
ans=2_000_000_001
x,y=0,(N-1)
ans_liquid=[]
while x<y:
total=(l[x]+l[y])
if abs(total) < ans:
ans=abs(total) #ans update
ans_liquid=[l[x],l[y]]
if total > 0:
y-=1
else:
x+=1
print(*ans_liquid)
๐งฆ ์ ๋ ฌ ๋ค, ๋ ์ฉ์ก์ ํฉ total์ด ์์๋ผ๋ฉด, 0์ ๋ ๊ฐ๊น๊ฒ ํ๊ธฐ ์ํด y๋ฅผ ์ผ์ชฝ์ผ๋ก, ์์๋ผ๋ฉด 0์ ๋ ๊ฐ๊น๊ฒ ํ๊ธฐ ์ํด x๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋. ์ ๋ ฌ๋์์ผ๋ฏ๋ก ์ ์ฒด ๋ฐ๋ณต๋ฌธ์ ๋ ํ์๋ ์๋ค (์ด๋ฏธ ๋ ํฌ๊ฑฐ๋ ์์ ๊ฒ ์๋ช ํ๋ฏ๋ก)
โ 2467 ์ฉ์ก โ
import sys
input=sys.stdin.readline
N=int(input())
l=list(map(int,input().split()))
ans=2_000_000_001
x,y=0,(N-1)
ans_liquid=[]
while x<y:
total=(l[x]+l[y])
if abs(total) < ans:
ans=abs(total) #ans update
ans_liquid=[l[x],l[y]]
if total > 0:
y-=1
else:
x+=1
print(*ans_liquid)
๐งฆ ์ 2470 ๋ฌธ์ ์์ ์ ๋ ฌ๋ง ๋์ด์์ผ๋ฏ๋ก ์ ๋ ฌ๋ง ์๋ต.
โ 2473 ์ธ ์ฉ์ก โ
import sys
input=sys.stdin.readline
N=int(input())
arr=sorted(list(map(int,input().split())))
final_ans=100_000_000_000_000_000
for x in range(N):
#find if y+z gets close to target
ans=100_000_000_000_000_000
target=(-arr[x])
y,z=x+1,N-1
while y<z:
total=arr[y]+arr[z]
if abs(total - target) < ans:
ans = abs(total - target)
if abs(arr[x]+total)< final_ans:
final_ans=abs(arr[x]+total)
ans_x_y_z=[arr[x],arr[y],arr[z]]
if total > target:
z-=1
else:
y+=1
print(*sorted(ans_x_y_z))
๐งฆ x๊ณ ์ ํ๊ณ y์ z๋ฅผ x+1, N-1๋ก ์ค์ ํด์ ์์ชฝ์์ ์ค๊ฐ์ผ๋ก ์์ง์ด๋ฉด์ ์ BOJ 2470 ๋ ์ฉ์ก ๋ฌธ์ ์ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ ๊ทธ๋๋ก ์ฌ์ฉ. ์ด ๋ ๋ ์ฉ์ก์ ํฉ์ 0์ด ์๋ -arr[x]์์ ์ฐจ์ด์ ๋ ๊ฐ๊น์ด์ง๋ฅผ ๋ฐ์ ธ์ผ ํ๊ณ , ๋ ์ฉ์ก์ ํฉ์ด -arr[x]๋ณด๋ค ํฐ ์ง, ์์ ์ง์ ๋ฐ๋ผ ๋ ํฌ์ธํฐ ์ด๋ ๊ธฐ์ค ์ ํ๋ฉด ๋๋ค.
โ 13144 List of Unique Numbers โ
import sys
input=sys.stdin.readline
N=int(input())
l=list(map(int,input().split()))
y=0
ans=0
kinds=set()
for x in range(N):
ans+=(y-x)
while y<N and l[y] not in kinds:
kinds.add(l[y])
ans+=1
y+=1
kinds.discard(l[x])
print(ans)
๐งฆ y๊ฐ 1๋ก ๋ฉ์ถ ์ํ์์ x๊ฐ 2๋ก ์์ง์์ ๋, ์ด์ฐจํผ ์งํํ ๋ถ๋ถ๊น์ง๋ ์ด๋ฏธ ๋ชจ๋ ์ค๋ณต๋ ์์๊ฐ ์์์ด ์ฆ๋ช ๋์์ผ๋ฏ๋ก(๊ทธ๋ฌ๋๊น y๊ฐ ์ด๋ํ ๊ฒ์ด๋ฏ๋ก) x๊ฐ 2์ผ ๋ 2๋ก ์์ํ๋ ๋ถ๋ถ์ฐ์์์ด(์ค๋ณต ์๋ ์์) [2], [2,3]์ ๊ฐ์ y-x๋ก ๊ตณ์ด y ๋ค์ ์์์ ์ถ๋ฐ ํ์ ์์ด ans์ ์๋์ผ๋ก ๊ฐ์ ๋ํ๋ฉด ๋๋ค.
โ 2230 ์ ๊ณ ๋ฅด๊ธฐ โ
import sys
input=sys.stdin.readline
N,M=map(int,input().split())
l=[int(input())for _ in range(N)]
l.sort()
ans=10_000_000_000
y=0
cumsum=0
for x in range(N):
while y<N and cumsum<M:
cumsum=(l[y]-l[x])
y+=1
if cumsum>=M:
ans=min(ans,cumsum)
if x<(N-1):
cumsum-=(l[x+1]-l[x])
print(ans)
๐งฆ ๋ ํฌ์ธํฐ๋ฅผ ์ผ์ชฝ์์ ์์ํด์ ๋ ์์ ์ฐจ์ด๊ฐ M ์ด์์ด๋ฉด์ ์ ์ผ ์์ ์ฐจ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
(1) ์ผ๋จ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
(2) x์ y ๋ ํฌ์ธํฐ ๋ง๋ค๊ณ , x๋ 0(index) ๊ณ ์ ํ ์ํ์์ y๋ฅผ 0(index)๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐจ์ด๊ฐ M์ด์์ผ ๋๊น์ง ๋๋ฆฌ๊ธฐ
(3) ๊ทธ ๋ค์ x ์์ง์ด๋ฉด์ cumsum ๋นผ๊ณ ํ์ฌ ๊ณ ์ ํ y์์ M์ด์์ผ ๋๊น์ง ๋ ๋๋ฆฌ๊ธฐ
(4) ์ ๊ณผ์ ๋ฐ๋ณตํ๋ฉฐ ์ต์ข ans updateํ ์ถ๋ ฅ
+ ๋ ํฌ์ธํฐ ๋ชจ๋ ๊ฐ๊ฐ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ํ๋ฒ์ฉ๋ง ๋๋ฆฌ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(N+N+NlogN) (์ ๋ ฌ ํฌํจ)
โ 1253 ์ข๋ค โ
import sys
input=sys.stdin.readline
N=int(input())
A=sorted(list(map(int,input().split())))
if N == 1 or N == 2: print(0); sys.exit()
ans=0
for i in range(N):
res=False
target=A[i]
x,y=0,N-1
if i == 0: x = 1
elif i == N-1: y = N-2
cursum=A[x]+A[y]
while x<y:
cursum=A[x]+A[y]
if target==cursum:
res=True
break
elif target<cursum:
y-=1
if y == i:
y-=1
else: #target>cursum
x+=1
if x == i:
x+=1
if res: ans += 1
print(ans)
๐งฆ N์ ๋ฒ์ 2000์ดํ์ด๋ฏ๋ก O(N^2) ์๊ฐ ๋ณต์ก๋ ๊ฐ๋ฅ. ์ ๋ ฌํ ๋ค, ๊ฐ ์๋ฅผ target์ผ๋ก ์ก๊ณ , target ์ด์ธ์ ๋ฐฐ์ด ๋ฒ์์์ ํฌ ํฌ์ธํฐ ์งํ. ์ด ๋ ์ ๋ ฌํ ๋ฒ์์ด๋ฏ๋ก, cursum์ด target๋ณด๋ค ํฌ๋ค๋ฉด y-=1 / ์๋ค๋ฉด x+=1.
๐งฆ ์ฃผ์ํ ๋ถ๋ถ์, ๋ ์์ ์ ์ธ ๋ค๋ฅธ ์๋ค ์ค์์ ํฉ์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก y๋๋ x๊ฐ i์ผ ๋ ์ถ๊ฐ๋ก y-=1 ๋๋ x+=1 ์งํ
๐งฆ ์๊ฐ๋ณต์ก๋ O(NlogN + N*(2*N))
โ 9024 ๋ ์์ ํฉ โ
def tp(l,i,j,K):
ans=10**20
ans_freq=0
ans_updated=False
while i<j:
cur=l[i]+l[j]
if cur==K:
ans=0
if not ans_updated:
ans_updated = True
ans_freq=1
else:
ans_freq+=1
i+=1
elif cur>K:
if ans>abs(cur-K):
ans=abs(cur-K)
ans_freq=1
elif ans==abs(cur-K):
ans_freq+=1
j-=1
else: #cur<K
if ans>abs(cur-K):
ans=abs(cur-K)
ans_freq=1
elif ans==abs(cur-K):
ans_freq+=1
i+=1
return ans_freq
import sys
input=sys.stdin.readline
t=int(input())
for _ in range(t):
n,K=map(int,input().split())
ns=sorted(list(map(int,input().split())))
ans=tp(ns,0,n-1,K)
print(ans)
๐งฆ ๋ ์์ ํฉ์ด K์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์์ ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
: ์๋ฅผ ๋ชจ๋ ์ ๋ ฌํ ๋ค, nC2 brute-force O(n^2)์ผ๋ก ์ผ์ผ์ด ๋ชจ๋ ์์ ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํ ํ์ ์์ด, ํฌ ํฌ์ธํฐ ์ ๊ทผ ๋ฐฉ์ O(n)์ผ๋ก ๋ง์กฑํ๋ ์์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค.
๐งฆ 1 3 5 7 9๊ฐ ์๊ณ K๋ฅผ 10์ด๋ผ๊ณ ํ๋ค๋ฉด, ํฌ ํฌ์ธํฐ i์ j๋ฅผ ์ ์ ๋งจ ๋์ ๋๋๋ค.
(1) ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ์์ ํฉ์ด K์ ์ ํํ๋ค๋ฉด ans(K์์ ์ฐจ์ด ์ต์๊ฐ)์ ๋ฐ๋ก 0์ผ๋ก ์ ๋ฐ์ดํธ. flag ๋ณ์์ ๋ฐ๋ผ ans_freq๊ฐ์ +=1ํ๊ฑฐ๋ 0์ผ๋ก ์ค์ .
(2) ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ์์ ํฉ์ด K๋ณด๋ค ์๋ค๋ฉด ans๋ฅผ ์ ๋ฐ์ดํธํ ์ง๋ ans์ abs(K-๋ ์์ ํฉ)์ ๋น๊ต. ans๋ณด๋ค abs(K-๋์์ ํฉ)์ด ์๋ค๋ฉด ์ ๋ฐ์ดํธ ans updateํ๊ณ ans_freq=1, ans์ abs(K-๋์์ํฉ)์ด ๊ฐ๋ค๋ฉด ์ ๋ฐ์ดํธ ํ์ ์์ด ๊ธฐ์กด ans_freq+=1
(3) ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ์์ ํฉ์ด K๋ณด๋ค ํฌ๋ค๋ฉด ์ (2)์ ๋์ผ ๋ฉ์ปค๋์ฆ
โป ๋จ, ํฌ ํฌ์ธํฐ ์ ๊ทผ ๋ฐฉ์์ ์ํด (2)์ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ j-=1 / (3)์ ๊ฒฝ์ฐ ์ผ์ชฝ ํฌ์ธํฐ i+=1 / (1)์ ์ํ๋๋๋ก i+=1 ๋๋ j-=1
๐งฆ ํฌ ํฌ์ธํฐ ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ด์ : 1 3 5 7 9๊ฐ ์๊ณ (list l, i๋ 0, j๋ ๋งจ ๋) K๋ฅผ 9๋ผ๊ณ ํ๋ค๋ฉด l[i]+l[j]๋ 9๋ณด๋ค ์๋ค. ๋ฐ๋ผ์ j๋ฅผ ์๋ฌด๋ฆฌ ์ผ์ชฝ์ผ๋ก ์ฎ๊ฒจ๋ 9๋ณด๋ค ๋ ์์๊ธฐ์ searchingํ ํ์ x(์ฐ๋ฆฌ๋ ์ต๋ํ K์ ๊ฐ๊น์ด ์์ ๊ฐ์๋ง ์ํ๋ค. ๋ฐ๋ผ์ ๊ตฌํ ์์์ ์์ ํฉ์ด ๋ ์์์ง๋ case๋ searchingํ ํ์ x - ํฌ ํฌ์ธํฐ๋ฅผ ์ธ ์ ์๋ ์ด์ ). ๋ฐ๋ผ์ j-=1ํ๊ณ ์งํ / ๋ฐ๋๋ก K๋ฅผ 10์ด๋ผ๊ณ ํ๋ค๋ฉด l[i]+l[j]๋ 9๋ณด๋ค ํฌ๋ค. ๋ฐ๋ผ์ i๋ฅผ ์๋ฌด๋ฆฌ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ๋ 9๋ณด๋ค ๋ ์ปค์ง๊ธฐ์ searchingํ ํ์ x. ๋ฐ๋ผ์ i+=1ํ๊ณ ๊ณ์ ์งํ
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Implementation&Simluation Upper-Advanced I - 1 Solvedโ (0) | 2024.03.03 |
---|---|
โ Stack & Queue & Deque Advanced I - 3 Solvedโ (0) | 2024.02.24 |
โ Implementation&Simluation Advanced I - 5 Solvedโ (0) | 2024.01.28 |
โ Backtracking Upper-Advanced I - 1 Solvedโ (0) | 2024.01.24 |
โ Backtracking Advanced I - 3 Solvedโ (1) | 2024.01.21 |
๋๊ธ