์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 33

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ๊ณ ๊ธ‰ ์ •๋ ฌ

์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 2

์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 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๋ฒˆ์งธ ์ˆ˜

์ •๋ ฌํ–ˆ์„ ๋•Œ 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์ •๋„ ๋น ๋ฅด๋‹ค.
-> ์ •๋ ฌ์€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ๋น ๋ฅด๋‹ค.

sort๊ธฐ๋ณธ

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ