• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

[๋ฐฑ์ค€] 1202

22 Jan 2021

๋ฌธ์ œ ๋งํฌ

  1. ํ’€์ด
  2. ์ฝ”๋“œ

ํ’€์ด

</img>

์‹œ๊ฐ„์ดˆ๊ณผ์™€ ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ๋กœ ๊ต‰์žฅํžˆ ์• ๋ฅผ ๋จน์—ˆ๋˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์ด ์ต์ˆ™ํ•ด์ง€๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค๋„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

์‹œ๊ฐ„์ดˆ๊ณผ ํ•ด๊ฒฐ

(1) input์„ sys.stdin.readline์œผ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
(2) Python์œผ๋กœ ๋Œ๋ฆฌ๋˜ ์ฝ”๋“œ๋ฅผ PyPy3์œผ๋กœ ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”! ์กฐ๊ธˆ ๋” ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
(3) 2์ค‘ for loop์„ ์ œ๊ฑฐํ•˜๊ณ  ํ•œ ๋ฒˆ๋งŒ ๋ณด์„ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”? N, K ๋ชจ๋‘ ์ตœ๋Œ€ 300,000๊นŒ์ง€ ๋“ค์–ด์˜ค๋ฏ€๋กœ ํŽธ์˜๋ฅผ ์œ„ํ•ด N๊ณผ K๋ฅผ ๋ฌถ์–ด์„œ N์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€๋žต 10^8์˜ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์— 1์ดˆ๊ฐ€ ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ์˜ ์‹œ๊ฐ„์ œํ•œ์€ 1์ดˆ์˜€๊ณ , 2์ค‘ for loop์„ ๋Œ๊ฒŒ ๋˜๋ฉด O(N^2)์ด๋ฉฐ, N์€ 3(10^5)์ด๋ฏ€๋กœ N^2์€ 9(10^10)์ด ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋žต 10^11 ์ •๋„ ๋˜๊ฒ ๋„ค์š”. ์ด๋Š” ๋ถ„๋ช…ํžˆ 1์ดˆ ๋‚ด์—๋Š” ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์ˆ˜์ž…๋‹ˆ๋‹ค. ์•„๋งˆ 100,000์ด ์•„๋‹ˆ๋ผ ์• ๋งคํ•˜๊ฒŒ 300,000์œผ๋กœ ์„ค์ •ํ•˜์‹  ๊ฒƒ๋„ ๋ฐ˜๋“œ์‹œ NlogN์œผ๋กœ ํ’€๊ฒŒ๋” ํ•˜๋ ค๋Š” ์˜๋„์ธ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ ํ•ด๊ฒฐ

(1) heapq์— ๋“ค์–ด๊ฐ€๋˜ ์ค‘๋ณต์„ ์—†์•ด์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ๋งŒ ๋ณด์„ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๊ฒŒ ํ•˜๋ฉด์„œ, ์ง์ „ ๊ฐ€๋ฐฉ์—์„œ ํƒ์ƒ‰์ด ๋๋‚œ ๊ณณ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ˆœํšŒํ•˜๊ฒŒ ๋ฐ”๊พธ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฑธ๊นŒ์š”? ๊ฐ€๋ฐฉ ๋ฐฐ์—ด์„ ๋ฌด๊ฒŒ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๊นŒ๋‹ญ์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์ค‘๋Ÿ‰ 2์ธ ๊ฐ€๋ฐฉ์ด ๋‹ด์„ ์ˆ˜ ์žˆ๋˜ ๋น„์‹ผ ๋ณด์„๋“ค์€, ๋‹น์—ฐํžˆ ์ตœ๋Œ€ ์ค‘๋Ÿ‰ 10์ธ ๊ฐ€๋ฐฉ๋„ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ƒˆ๋กญ๊ฒŒ heap์— ๋„ฃ์–ด์ค„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ

import heapq

N, K = map(int, input().split())
jew = [list(map(int, input().split())) for _ in range(N)] # m, v
bag= [int(input()) for _ in range(K)]

jew = sorted(jew, key=lambda x : x[0])
bag.sort()

ans = 0

h = []
j_idx = 0
for b in bag :
    while(True) :
        if(j_idx >= N) :
            break
        j = jew[j_idx]
        if(j[0] <= b) :
            heapq.heappush(h, -j[1])
            j_idx+=1
        else :
            break
    if(h) :
        ans -= heapq.heappop(h)

print(ans)


problem_solvingpython Share Tweet +1