๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜(BOJ)_1253๋ฒˆ['์ข‹์€ ์ˆ˜' ๊ตฌํ•˜๊ธฐ]

by alswlfl 2022. 11. 18.

'์ข‹์€ ์ˆ˜' ๊ตฌํ•˜๊ธฐ[1253๋ฒˆ]

Q. N๊ฐœ์˜ ์ˆ˜ ์ค‘์—์„œ ์–ด๋–ค ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ˆ˜ ๋‘ ๊ฐœ์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ์ˆ˜๋ฅผ “์ข‹๋‹ค(GOOD)”๊ณ  ํ•œ๋‹ค.

N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ทธ ์ค‘์—์„œ ์ข‹์€ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” ๋ช‡ ๊ฐœ์ธ์ง€ ์ถœ๋ ฅํ•˜๋ผ.

์ˆ˜์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฐ’์ด ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ์ˆ˜์ด๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 2,000), ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” i๋ฒˆ์งธ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Ai๊ฐ€ N๊ฐœ ์ฃผ์–ด์ง„๋‹ค. (|Ai| ≤ 1,000,000,000, Ai๋Š” ์ •์ˆ˜)

 

์ถœ๋ ฅ

์ข‹์€ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ


๋ฌธ์ œ ๋ถ„์„

N์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 2,000์ด๋ผ ๊ฐ€์ •ํ•ด๋„ ์ข‹์€ ์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” N2๋ณด๋‹ค ์ž‘์•„์•ผ ํ•จ

์ข‹์€ ์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ตœ์†Œ O(nlogn)์ด์–ด์•ผ ํ•จ

์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์ •์ˆ˜์˜ ํ•ฉ์ด ํ•ด๋‹น K๊ฐ’๊ณผ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋ฉด์„œ ์ข‹์€ ์ˆ˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

(๋‹จ, ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ์ข‹์€ ์ˆ˜ ๋งŒ๋“ค๊ธฐ์— ํฌํ•จํ•˜๋ฉด ์•ˆ๋จ → K์˜ ์ธ๋ฑ์Šค ๊ฐ’๊ณผ ๋‘ ์ˆ˜์˜ ์ธ๋ฑ์Šค ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ์•ˆ๋จ

[ํˆฌ ํฌ์ธํ„ฐ ์ด๋™ ์›์น™]
• A[i]+A[j] > K: j--;
• A[i]+A[j] < K: i++;
• A[i]+A[j] == K: count++; ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ

์Šˆ๋„์ฝ”๋“œ ์ž‘์„ฑ

1. ์ˆ˜์˜ ๊ฐœ์ˆ˜ N์ž…๋ ฅ๋ฐ›๊ธฐ
2. ๋ฆฌ์ŠคํŠธ A ์ž…๋ ฅ๋ฐ›๊ธฐ
3. ๋ฆฌ์ŠคํŠธ A ์ •๋ ฌ
4. for k in range(N): k๊ฐ€ N์ด ๋ ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰
	i=0		ํฌ์ธํ„ฐ ๊ฐ’ ์ดˆ๊ธฐํ™”
    j=N-1
    K=A[k] ํŒ๋ณ„ ๋Œ€์ƒ์ธ ์ˆ˜ K๊ฐ’ ์ง€์ •
    while i<j:  i์™€ j๊ฐ€ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜๋ณต
    	ํˆฌํฌ์ธํ„ฐ ์ด๋™ ์›์น™ ์ด์šฉ
        โญ๏ธ k๊ฐ€ i์™€ ๊ฐ™๊ฑฐ๋‚˜, k๊ฐ€ j๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•ด์ฃผ์–ด์•ผ ํ•จ(์ž๊ธฐ ์ž์‹ ์€ ์ข‹์€ ์ˆ˜ ๋งŒ๋“ค๊ธฐ์— ํฌํ•จํ•˜๋ฉด ์•ˆ๋จ)
5. ์ข‹์€ ์ˆ˜์˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ

์ฝ”๋“œ ๊ตฌํ˜„

import sys
input=sys.stdin.readline
N=int(input()) #์ˆ˜์˜ ๊ฐœ์ˆ˜
A=list(map(int, input().split()))  #N๊ฐœ์˜ ์ˆ˜ ๊ฐ’ A๋ฆฌ์ŠคํŠธ
A.sort()  #๋ฆฌ์ŠคํŠธ ์ •๋ ฌ
count=0
for k in range(N):  #K๊ฐ€ N๊ฐœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    i=0  #i์™€ j๋ฅผ ๋ฐฐ์—ด A ์–‘์ชฝ ๋์— ์œ„์น˜
    j=N-1
    K=A[k] 
    while(i<j):  #i์™€ j๊ฐ€ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜๋ณต
        #ํˆฌ ํฌ์ธํ„ฐ ์ด๋™ ์›์น™
        if (A[i]+A[j])>K: 
            j-=1
        elif (A[i]+A[j])<K:
            i+=1
        else:
            if k==i: #์ž๊ธฐ ์ž์‹ ์ด ์ข‹์€ ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ์ œ์™ธ
                i+=1 
            elif k==j: #์ž๊ธฐ ์ž์‹ ์ด ์ข‹์€ ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ์ œ์™ธ
                j-=1
            else:
                count+=1  #count๊ฐ’ ์ฆ๊ฐ€์‹œํ‚ค๊ณ 
                break #ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
print(count)