[๋ฐฑ์ค] 1940 ์ฃผ๋ชฝ with Python
๐ BOJ 1940 ์ฃผ๋ชฝ
๐ก ์กฐ๊ฑด
๊ฐ์ท์ ๋ ๊ฐ์ ์ฌ๋ฃ๋ก ๋ง๋๋๋ฐ ๋ ์ฌ๋ฃ์ ๊ณ ์ ํ ๋ฒํธ๋ฅผ ํฉ์ณ์ M(1 โค M โค 10,000,000)์ด ๋๋ฉด ๊ฐ์ท์ด ๋ง๋ค์ด ์ง๊ฒ ๋๋ค.
N(1 โค N โค 15,000) ๊ฐ์ ์ฌ๋ฃ์ M์ด ์ฃผ์ด์ก์ ๋ ๋ช ๊ฐ์ ๊ฐ์ท์ ๋ง๋ค ์ ์๋์ง๋ฅผ ๊ตฌํ๋ ๋ฌธ์
์ ๋ ฌ, ํฌ ํฌ์ธํฐ ์ ํ์ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
from sys import stdin
from bisect import bisect_left
n = int(stdin.readline())
m = int(stdin.readline())
arr = sorted(list(map(int, stdin.readline().split())))
res = 0
visited = set()
arr.sort()
for i in arr:
f = bisect_left(arr, m-i)
if f < n and arr[f] != i:
temp = arr[f]
if temp + i == m and (temp, i) not in visited:
visited.add((temp, i))
visited.add((i, temp))
res += 1
print(res)
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
6
9
2 7 4 1 5 3
์คํ๊ฒฐ๊ณผ
2
โจ๏ธ ๋ฌธ์ ํ์ด
์ ๋ ฌ์ ํด์ ํฌํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ์ด ๋ฌธ์ ์ ์์ ์ธ ๊ฒ ๊ฐ๋ค.
๋๋ ํ์ด์ฌ bisect ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ bisect_left ๋ฅผ ์จ์ ์ฝ๊ฒ ํ์ ์์๋ค.
์ฌ๋ฃ๋ค์ ๊ฐ ๊ณ ์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ ๋์ arr์ด๋ผ๋ ๋ณ์๋ฅผ ์ ๋ ฌํ๊ณ ์ํํ๋ค.
(3)๋ฒ์ ํตํด ์ํํ๋ ๊ฐ์ธ i๊ฐ ์๋ค.
๊ฐ์ท์ด ๋ง๋ค์ด์ง๊ธฐ ์ํ ๊ฐ m ์์ i๋ฅผ ๋บ ๊ฐ์ด arr ๋ฆฌ์คํธ์ ์์นํ๊ณ ์๋์ง
bisect_left ๋ฅผ ํตํด ์ด๋ถํ์ํด์ค ๊ฒฐ๊ณผ๋ฅผ f ๋ณ์์ ์ ์ฅํ๋ค.
f ๊ฐ n ๋ณด๋ค ์๊ณ , arr[f]๊ฐ i์ ๊ฐ์ง ์๋ค๋ฉด, i + f๋ m์ด๋ค.(4)์์ ๋์จ ๊ฒฐ๊ณผ ๊ฐ์ด ์ฐธ์ธ์ง ํ์ธํ๊ณ , (arr[f], i) ์ ์์ด ํ๋ฒ๋ ๋์จ์ ์๋ ์กฐํฉ์ด๋ผ๋ฉด
res + 1์ ํด์ฃผ๊ณ , (arr[f], i), (i, arr[f]) ๋ฅผ visited์ ์ ์ฅํด ์ด๋ฏธ ๋์จ ์กฐํฉ์ด๋ผ๊ณ ํ์ํด๋๋ค.(1)~(5) ๊ณผ์ ์ ๊ฑฐ์น๊ณ ๋ ํ, res๋ฅผ ์ถ๋ ฅํด์ค๋ค.
๐พ ๋๋์
- ํฌํฌ์ธํฐ๋ก ํ๋ฉด ํจ์ฌ ์ฌ์ ์ ๊ฒ ๊ฐ์๋ฐ, 3๋ฌ ์ ์ ๋๋ ์ bisect ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์๊น?
- ํฌํฌ์ธํฐ๋ฅผ ์ฐ์ตํ๊ธฐ ๋งค์ฐ ์ข์ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.