BOJ/๐Ÿฅˆ

โ˜…Two-Pointers Upper-Intermediate I - 5 Solvedโ˜…

metamong 2024. 2. 11.

โ˜… 3273 ๋‘ ์ˆ˜์˜ ํ•ฉ โ˜…

 

import sys
input=sys.stdin.readline
n=int(input())
l=list(map(int,input().split()))
X=int(input())

#array
l.sort()

#two-pointers
x,y=0,n-1
ans=0

while x<y:
    total=l[x]+l[y]
    if total == X:
        ans+=1
        x+=1
        y-=1
    elif total < X:
        x+=1
    else: #total > X
        y-=1
        
print(ans)

 

๐Ÿก ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ๋’ค, x๋ฅผ ๋ฐฐ์—ด ์™ผ์ชฝ ๋ / y๋ฅผ ๋ฐฐ์—ด ์˜ค๋ฅธ์ชฝ ๋์— ๋ฐฐ์น˜. l[x]+l[y]๊ฐ€ X๋ณด๋‹ค ํด ๊ฒฝ์šฐ, x๋ฅผ ์•„๋ฌด๋ฆฌ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•ด๋„ X๋ณด๋‹ค ํด ์ˆ˜ ๋ฐ–์— ์—†์Œ. ๋”ฐ๋ผ์„œ y๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ / l[x]+l[y]๊ฐ€ X๋ผ๋ฉด ์ •๋‹ต ์ฐพ์Œ! ans+=1 ํ•œ ๋’ค, l[x]์™€ l[y]๋Š” ์ด์ œ X ๋‚˜์˜ค๋Š” ์—ฐ์‚ฐ์— ํ•„์š” ์—†์œผ๋ฏ€๋กœ x ์˜ค๋ฅธ์ชฝ ์ด๋™, y ์™ผ์ชฝ ์ด๋™ / l[x]+l[y]๊ฐ€ X๋ณด๋‹ค ์ž‘๋‹ค๋ฉด y๋ฅผ ์•„๋ฌด๋ฆฌ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ด๋„ ๋” ์ž‘์•„์ง€๊ธฐ์— X๋ฅผ ๋งŒ๋“ค์ˆ˜ ์—†์Œ. ๋”ฐ๋ผ์„œ x๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™. ์ด ๋•Œ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด x๊ฐ€ 5์ด๊ณ  y๊ฐ€ 9์ผ ๋•Œ, ์ด๋ฏธ y๊ฐ€ ์ง€๋‚˜์นœ 10, 11, 12๋Š” x๊ฐ€ 5์ผ ๋•Œ ๋˜ ์ ๊ฒ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค(ํˆฌ ํฌ์ธํ„ฐ ํŠน์ง•). X์™€ ๊ฐ™๊ฑฐ๋‚˜ X๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ์˜ค๋ฅธ์ชฝ y๊ฐ€ ์ง€๋‚˜์นœ ์›์†Œ๋“ค์€ ๋ณผ ํ•„์š”๊ฐ€ ์—†๊ณ , X๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋‹ต์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์ด๋Š” ์ด๋ฏธ y๊ฐ€ ๊ธฐ์กด y๋ณด๋‹ค ๋” ํด ๊ฒฝ์šฐ ์ง„ํ–‰์„ ํ–ˆ๊ธฐ์— ๋” ์ด์ƒ 10, 11, 12๋ฅผ x๊ฐ€ 5์ผ ๋•Œ checkํ•  ํ•„์š” ์—†๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„ O(logn+n+n)   


โ˜… 2003 ์ˆ˜๋“ค์˜ ํ•ฉ 2 โ˜…

import sys
input=sys.stdin.readline
N,M=map(int,input().split())
l=list(map(int,input().split()))

y=0
cumsum=0
ans=0
for x in range(N):
    while y<N and cumsum<M:
        cumsum+=l[y]
        y+=1
    if cumsum==M:
        ans+=1
    cumsum-=l[x]
print(ans)

 

๐Ÿก i์™€ j ๋ชจ๋‘ ๋ฐฐ์—ด ์™ผ์ชฝ ๋์— ์ปค์„œ๋กœ ๋†“๊ณ , x ๊ณ ์ •ํ•œ ์ƒํƒœ์—์„œ M์ด ์ž‘์„ ๋•Œ๊นŒ์ง€ y ๊ณ„์† ์ด๋™. ์ปค์ง€๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด, ๊ฐ™์„ ๊ฒฝ์šฐ ans += 1, ๊ทธ ๋‹ค์Œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ x ์ด๋™ํ•ด์„œ ํ˜„์žฌ ๋ˆ„์ ํ•ฉ์—์„œ l[x] ๋นผ๊ธฐ. ๋ฌธ์ œ ์ž์ฒด์— A[i] ~ A[j] ์‚ฌ์ด์˜ ๋ˆ„์ ํ•ฉ์ด๋ผ๊ณ  ํ•ด์„œ ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ์˜ ์ •๋‹น์„ฑ ์ฆ๋ช… ํ•„์š”์—†์ด ๋ฐ”๋กœ ํˆฌ ํฌ์ธํ„ฐ ์‚ฌ์šฉ


โ˜… 2559 ์ˆ˜์—ด โ˜…

 

import sys
input=sys.stdin.readline

N,K=map(int,input().split())
l=list(map(int,input().split()))

ans=-1_000_000_000
cursum=0
y=0
cnt=0
for x in range(N):
    while y<N and cnt<K:
        cursum+=l[y]
        cnt+=1
        y+=1
    if cnt==K:
        ans=max(ans,cursum)
        cursum-=l[x]
        cnt-=1
    else:
        break
print(ans)

 

๐Ÿก k๊ฐœ์˜ ์—ฐ์†ํ•œ ๋ˆ„์ ํ•ฉ์ด๋ฏ€๋กœ ํˆฌ ํฌ์ธํ„ฐ ์‚ฌ์šฉ์˜ ์ •๋‹น์„ฑ์€ ์ž๋ช…. cnt<K์ผ ๋•Œ๊นŒ์ง€ y+=1ํ•˜๋ฉฐ ๋”ํ•ด๋‚˜๊ฐ€๊ณ , cnt==K๋ผ๋ฉด ans update(์ตœ๋Œ€๋ผ๋ฉด)์™€ ํ•จ๊ป˜ cursum ๋ˆ„์ ํ•ฉ์— l[x] ๋นผ๊ณ , cnt-=1. ๋งŒ์•ฝ y๊ฐ€ ๋ฐฐ์—ด ๋์œผ๋กœ ์ด๋™ํ•ด์„œ cnt==K์•„๋‹ˆ๋ผ๋ฉด ๋” ์ด์ƒ ์—ฐ์†ํ•ด์„œ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒ


โ˜… 1940 ์ฃผ๋ชฝ โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
M=int(input())
l=list(map(int,input().split()))
l.sort()
x,y=0,N-1
cumsum=200_001
ans=0

while x<y:
    total=(l[x]+l[y])
    if total < M:
        x+=1
    elif total == M:
        ans+=1
        x+=1
        y-=1
    else: #total > M
        y-=1
print(ans)

 

๐Ÿก 3273 ๋‘ ์ˆ˜์˜ ํ•ฉ๊ณผ ๋™์ผ ์œ ํ˜•(ํˆฌ ํฌ์ธํ„ฐ ์•ˆ์จ๋„ ๋˜๋‚˜ ํˆฌ ํฌ์ธํ„ฐ๋กœ O(N)) ํ’€์ด)


โ˜… 2531 ํšŒ์ „ ์ดˆ๋ฐฅ โ˜…

 

๐Ÿก G4 15961 ํšŒ์ „ ์ดˆ๋ฐฅ ํ’€์ด ์ฐธ์กฐ(N ์กฐ๊ฑด ๋ฒ”์œ„๊ฐ€ ๋” ์ปค์ง)


 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€