๐ก ์กฐ๊ฑด ๋ฐ ํ์ด
n
๊ฐ์ ์๋ก ๋ค๋ฅธ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด A
๊ฐ ์๋ค. 1 <= A[i] <= 1000000
n
์ ํฌ๊ธฐ๋ 1 <= n <= 100000
x์ ํฌ๊ธฐ๋ 1 <= x <= 2000000
- sort + binary search ์ ํ์ ๋ฌธ์
- ์์ฐ์ x๊ฐ ์ฃผ์ด์ก์ ๋,
A[i] + A[j] = x
๋ฅผ ๋ง์กฑํ๋ ์์ ์๋ฅผ ๊ตฌํ๋ค.
(A[i], A[j])
๐ฅ ์์ค ์ฝ๋
from sys import stdin
from bisect import bisect_right, bisect_left
n = int(stdin.readline())
arr = list(map(int, stdin.readline().split()))
arr.sort()
x = int(stdin.readline())
cnt = 0
for i in range(n):
l, r = bisect_left(arr, x - arr[i]), bisect_right(arr, x - arr[i])
if l < n:
if arr[i] != arr[l] and l != r:
cnt += 1
print(cnt // 2)
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
9
5 12 7 10 9 1 2 3 11
13
์คํ๊ฒฐ๊ณผ
3
โจ๏ธ ๋ฌธ์ ํ์ด
Python
์ธ์ด์ ๋ฐฐ์ด ์ด์ง ๋ถํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ bisect
์ฌ์ฉ.
- list๋ก ๋ฐ์ ์์ด์
sort()
๋ก ์ ๋ ฌ.
- ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด 0๋ฒ ์ธ๋ฑ์ค๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๋ฉฐ
bisect_left
, bisect_right
ํจ์๋ฅผ ์ฌ์ฉํด ๋ฐํ๋ฐ์ ๊ฐ(l, r)
์ ๋น๊ตํ๋ค.
- ์์ด์ ์ด ๊ฐ์(
n
)๋ณด๋ค bisect_left
๋ก ๋ฐํ๋ฐ์ ๊ฐ(l
)์ด ์์ ๋๋ง ์คํํ๋ค.
- ํ์ฌ ์์ด์ i๋ฒ์งธ ์ซ์์ ์์ด์ l๋ฒ์งธ ์ซ์๊ฐ ๊ฐ์ง ์์ผ๋ฉฐ,
r
๊ณผ l
์ด ๊ฐ์ง ์์ ๋ cnt += 1
- ๋ฐ๋ก
for
๋ฌธ์ ๋ฒ์๋ฅผ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด, ์ ๋ต์ ํด๋นํ๋ (A[i], A[j])
์์ด
๋๋ฒ์ด ๋์ค๊ธฐ ๋๋ฌธ์ cnt // 2
๋ฅผ ํด์ค๋ค.
๐พ ๋๋์
n
์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ for
๋ฌธ์ ๋ฒ์๋ฅผ ์๋ชป ์ง์ ํด์ฃผ์ด์ ํ๋ ธ์๋ค.
bisect
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ฐพ์ผ๋ ค๊ณ ํ๋ ์ซ์์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ์๋ชป ๊ณ์ฐํด์ ํ๋ ธ์๋ค.
- ์ด๋ถํ์ ๋ฌธ์ ๋ฅผ ๋ ๋ง์ด ํ์ด๋ณด๊ณ , ๋ค์ํ ์ ํ์ ๊ฒฝํํด๋ณด์์ผ๊ฒ ๋ค.