์ด๋ถํ์(binary_search)ํ์ฌ ์ํ๋ ์นด๋์ ๊ฐ์๋ฅผ ์ฐพ์๋ด๋ bs()ํจ์๋ฅผ ๋ง๋ค๊ณ , N,M,๊ฐ ์นด๋๋ฅผ ์
๋ ฅ๋ฐ์ dictionary์ ์ ์ฅํ์
(์นด๋ ๊ฐ์๋ dictionary์ .get()
์ ์ด์ฉํ์ฌ ๊ฐ์ ธ์ด)
๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋ฆฌ๋ฉด์ bs()ํจ์๋ฅผ ํตํด M์ ๊ฐ ์นด๋๊ฐ N์ ๋ช๊ฐ๊ฐ ์๋์ง ํ์ํ์ฌ ์ถ๋ ฅํด๋ณด์
import sys
def bs(arr, target, start, end):
if start > end:
return 0
mid = (start+end)//2
if arr[mid] == target :
#target ์ผ์นํ ๊ฒฝ์ฐ dictionary์ ๊ฐ return
return cnt.get(target)
elif arr[mid] > target :
#num[mid]๊ฐ์ด M์ ํด๋น ์นด๋๋ณด๋ค ํฌ๋ค๋ฉด end = mid-1
return bs(arr, target, start, mid-1)
else:
#num[mid]๊ฐ์ด M์ ํด๋น ์นด๋๋ณด๋ค ์๋ค๋ฉด start = mid+1
return bs(arr, target, mid+1, end)
n = int(sys.stdin.readline().rstrip())
#N์ ์นด๋๋ ์ ๋ ฌํ์ฌ ์ ์ฅ (โป์ด๋ถํ์ ๊ธฐ๋ณธ์กฐ๊ฑด! arr์ ๋ ฌํ๊ธฐ)
num = sorted(list(map(int, sys.stdin.readline().split())))
m = int(sys.stdin.readline().rstrip())
comp = list(map(int, sys.stdin.readline().split()))
#๋น dictionary
cnt = {}
#num๊ฐ์ ์ฐจ๋ก๋๋ก "์นด๋:๊ฐ์"ํํ๋ก ์ ์ฅ
for i in num :
#dictionary์ num์ i๊ฐ์ด ์๋ค๋ฉด +1
if i in cnt :
cnt[i] += 1
#dictionary์ num์ i๊ฐ์ด ์๋ค๋ฉด, cnt[i]๋ง๋ค๊ณ 1์ ์ฅ
else :
cnt[i] = 1
for i in comp :
print(bs(num, i, 0, len(num)-1), end=' ')
def bs(arr, target, start, end):
if start > end:
return 0
mid = (start+end)//2
if arr[mid] == target :
return cnt.get(target) #dictionary ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
elif arr[mid] > target :
return bs(arr, target, start, mid-1)
else:
return bs(arr, target, mid+1, end)
โป์ด๋ถํ์(binary_search)
1. ๋ฐฐ์ด(arr)์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์ฌ ์ ์ฅํ๋ค
2. ๋น๊ตํ ๊ฐ(target)์ด arr์ ์ค๊ฐ(arr[mid])์ ์๋ ๊ฐ๋ณด๋ค ์์ผ๋ฉด,
end = mid-1ํ์ฌ ์ด๋ถํ์์ ์ฌ์คํํ๋ค
(ex/ 0~9๋ฐฐ์ด์ target์ด arr[4]๋ณด๋ค ์์ผ๋ฉด, 0~3์ฌ์ด๋ฅผ ์ฌ์คํ)
2. ๋น๊ตํ ๊ฐ(target)์ด arr์ ์ค๊ฐ(arr[mid])์ ์๋ ๊ฐ๋ณด๋ค ํฌ๋ฉด,
start = mid+1ํ์ฌ ์ด๋ถํ์์ ์ฌ์คํํ๋ค
(ex/ 0~9๋ฐฐ์ด์ target์ด arr[4]๋ณด๋ค ํฌ๋ฉด, 5~9์ฌ์ด๋ฅผ ์ฌ์คํ)
3. ๋ง์นจ๋ด ๋น๊ตํ ๊ฐ(target)์ด arr[mid]์ ๊ฐ์ผ๋ฉด ํด๋น ๊ฐ return
โปํ์ํจ์๋ ์ ์์ ์ฒ๋ผ ์ฌ๊ทํจ์๋ก ๊ตฌํํด๋ ๋์ง๋ง,
while start >= end์ if/else๋ก ๋ฐ๋ณต์คํ๋ ๊ฐ๋ฅํ๋ค
import sys
n = int(sys.stdin.readline().rstrip())
num = sorted(list(map(int, sys.stdin.readline().split())))
m = int(sys.stdin.readline().rstrip())
comp = list(map(int, sys.stdin.readline().split()))
#๋น dinctionary ์ ์ธ
#์ฌ๊ธฐ์ {์นด๋:๊ฐ์, ...} โ {-10:2 ...}ํํ๋ก ์ ์ฅ๋ ๊บผ์
cnt = {}
for i in num :
#cnt์ num์ i๊ฐ ์์ผ๋ฉด +1
#ex) cnt์์ -10:1 ์ด ์์ผ๋ฉด -10:2์ผ๋ก +1ํด์ค
if i in cnt :
cnt[i] += 1
#cnt์ num์ i๊ฐ ์์ผ๋ฉด ๋ฑ๋ก
#ex) -10์์ผ๋ฉด -10:1 ๋ฑ๋ก
else :
cnt[i] = 1
์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฌ์
โปcnt.get(-10)ํ์์ผ๋ก ๊ฐ ๊ฐ์ ธ์ฌ ์ ์์
for i in comp :
print(bs(num, i, 0, len(num)-1), end=' ')
import sys
n = int(sys.stdin.readline().strip())
num = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline().strip())
comp = list(map(int, sys.stdin.readline().split()))
res = ''
for i in comp :
cnt = 0
for j in num :
if i == j :
cnt += 1
res += str(cnt)+' '
print(res)
๐
๐ปโโ๏ธ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ๊ฒ์ด ๋ฌธ์ !
๋ฌธ์ ์์ ์ ์ํ O(N)๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ ์์ํ์
์! ์ด๋ถํ์(binary_search)์ด๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์๊ตฐ
์ด์ ์ผ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ๊ฒ ๊ฐ๋ค
์ด๋ถํ์ ํจ์ ์ฌ๊ทํจ์๋ก ๋ง๋ค๋ฉด ๋๋๊ฒ ๋ค?๐คท๐ปโโ๏ธ
<import sys
n = int(sys.stdin.readline().rstrip())
num = list(map(int, sys.stdin.readline().split()))
s_num = sorted(num)
m = int(sys.stdin.readline().rstrip())
comp = list(map(int, sys.stdin.readline().split()))
def binary(arr, target, start, end) :
cnt = 0
mid = (start+end)//2
if start > end:
return 0
elif arr[mid] == target :
cnt = num.count(arr[mid])
return str(cnt)
elif arr[mid] > target :
return (binary(arr, target, start, mid-1))
else:
return (binary(arr, target, start+1, end))
for i in comp :
print(binary(s_num, i, 0, len(num)-1), end=' ')
๐
๐ปโ๋ฐํ์ ์๋ฌ (IndexError)
ใ
ใ
์ ์ผ ์ดํด์๊ฐ๊ณ ์๋ฌ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ ์๋ฌ๋ค.
ํด๋น ์๊ณ ๋ฆฌ์ฆ์์ ์๋ฌ๊ฐ ๋ ์ด์ ๋ cnt=num.count(arr[mid])์ธ ๊ฒ์ผ๋ก ์ถ์ !
๊ฒ์ํด๋ณด๋๊น .count()๊ฐ ์๊ฐ๋ณด๋ค ์๊ฐ์ ๋ง์ด ์ก์๋จน๋ ๊ฒ ๊ฐ์