์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 33
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ๊ณ ๊ธ ์ ๋ ฌ
์ ์ ๋ ฌํ๊ธฐ 2
๋ฐ์ดํฐ ์ 1,000,000 / ์๊ฐ์ ํ 2์ด / ๋ฉ๋ชจ๋ฆฌ ์ ํ 256MB / ๋ฐ์ดํฐ์ ๋ฒ์ -1,000,000~1,000,000 (2,000,001)
$O(n^2)$์ ๊ฐ๋ฅํ ๊น? 1,000,000,000,000? ๋ฑ ๋ด๋ 2์ด ๋ถ๊ฐ๋ฅํด ๋ณด์ธ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ ์๊ฐ๋๋ ๊ฒ์ ๊ฐ์ฅ ์ต๊ทผ์ ํด๋ณธ ๊ณ์์ ๋ ฌ์ด๊ฒ ๋ค.
๊ณ์์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋ $O(n) = 1,000,000$, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฝ 4MB์ ๋,
๋ฆฌ์คํธ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ ค๋ฉด,
์ ์ฅ์ : ๊ฐ + 1,000,000 , ์ถ๋ ฅ์ : ๊ฐ - 1,000,000 ํด์ผํ๋ค๋ ๋จ์ ์ด ์กด์ฌ
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋๋ฌด๋ง์ด ๋จ์ง ์๋? ๋ณดํต ๋ฉ๋ชจ๋ฆฌ๋ 128MB์ฃผ๊ธฐ ๋ง๋ จ์ธ๋ฐ, ์ด๋ฒ์๋ ๋๋ฐฐ๋ก ์ค ์ด์ ๊ฐ ์์ง ์์๊น?
๊ทธ๋ ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฐฐ๋ก ์ฐ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํด๋ณด๋ฉด,
๋ณํฉ์ ๋ ฌ(Merge Sort)๊ฐ ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅธ๋ค.
์๊ฐ๋ณต์ก๋๋ $O(n log n)$์ด ๋ณด์ฅ๋๊ณ ,
๊ณต๊ฐ๋ณต์ก๋๋ ๋งค๋ฒ ๋ณต์ฌํ ๊ณต๊ฐ์ด ํ์ํด์ ๋๋ฐฐ๊ฐ ํ์ํ๋ค.
๋ฌธ์ ์ ์๋๋ ๋ณํฉ์ ๋ ฌ์ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๊ทธ๋ฌ๋ ์ด์ ์ ์ฌ์ฉํ๋ ๊ณ์์ ๋ ฌ ์ฝ๋๋ฅผ ์กฐ๊ธ๋ง ๋ฐ๊พธ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉํ๊ฒ ๋ค.
import sys
n = int(sys.stdin.readline())
s = [0 for _ in range(2000001)]
for _ in range(n):
s[int(sys.stdin.readline()) + 1000000] += 1
for e in range(2000001):
if s[e]:
print('{}\n'.format(e - 1000000) * s[e], end='')
K๋ฒ์งธ ์
์ ๋ ฌํ์ ๋ k๋ฒ์งธ์ ์๋ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
์๊ฐ์ ํ 2์ด / ๋ฉ๋ชจ๋ฆฌ ์ ํ 512MB / ๋ฐ์ดํฐ ์ 5,000,000 / ๊ฐ ๋ฒ์ $-10^9 \le v \le 10^9$
์ด๋ฒ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ฒญ ๋ง์ด ์ฃผ์ด์ก๋ค.
์ ๋ ฌํด์ผํ ๋ฐ์ดํฐ์ ์๋ ์์ฒญ ๋ง๋ค.
๊ฐ์ฅ ๋จผ์ ๋ณํฉ์ ๋ ฌ์ ์๊ฐํด๋ณด์ $O(n log n)$ = 111,267,483 (์ฝ 1์ต) ๋ ๊ฒ ๊ฐ๋ค.
๋ค์์ ๊ณ์์ ๋ ฌ์ ์๊ฐํด๋ณด์ ๊ฐ ๋ฒ์๊ฐ ๋๋ฌด ํฌ๋ค. $4byte210^9+1$๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค.
def mergeSort(list):
if len(list) <= 1:
return list
mid = int(len(list)/2)
ll, rl = list[:mid], list[mid:]
mergeSort(ll), mergeSort(rl)
idx, li, ri = 0, 0, 0
while True:
if ll[li] < rl[ri]:
list[idx] = ll[li]
li += 1
idx += 1
if li == len(ll):
for i in range(ri, len(rl)):
list[idx] = rl[i]
idx += 1
break
else:
list[idx] = rl[ri]
ri += 1
idx += 1
if ri == len(rl):
for i in range(li, len(ll)):
list[idx] = ll[i]
idx += 1
break
return list
n, k = list(map(int, input().split(' ')))
l = list(map(int,input().split(' ')))
print(mergeSort(l)[k - 1])
๋ณํฉ์ ๋ ฌ์ ํตํด์ ํด๊ฒฐํ๋ค.
PyPy3์ผ๋ก ์ ์ถํ์ง ์์ผ๋ฉด ์๊ฐ์ด๊ณผ๋๋ค.
๊ทธ๋ฆฌ๊ณ python์์ ์ง์ํ๋ sort()๋ฅผ ํตํด ํด๋ณธ ๋ฐฉ๋ฒ
n, k = list(map(int, input().split(' ')))
l = list(map(int,input().split(' ')))
l.sort()
print(l[k-1])
PyPy3์ Python3์ ์คํ์๊ฐ์ด ๊ฑฐ์ ๋๋ฐฐ์ ๋ ์ฐจ์ด๊ฐ ๋๋ค.
๋, ์ง์ ๊ตฌํํ ๋ณํฉ์ ๋ ฌ๋ณด๋ค 1300ms์ ๋ ๋น ๋ฅด๋ค.
-> ์ ๋ ฌ์ ์ง์ ๊ตฌํํ๋ ๊ฒ๋ณด๋ค ๋ด์ฅ๋์ด ์๋ ๊ฒ์ ์ฌ์ฉํ๋๊ฒ ๋ ๋น ๋ฅด๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ