Group Study (2022-2023)/Coding Test

[Coding Test] 2์ฃผ์ฐจ - Data Structure2

dusdb 2023. 1. 28. 21:46

 

 

๐ŸŸก14425 ๋ฌธ์ž์—ด ์ง‘ํ•ฉ

์„ค๋ช…

  • N๊ฐœ์˜ ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ์ง‘ํ•ฉ S๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฃผ์–ด์ง€๋Š” M๊ฐœ ๋ฌธ์ž์—ด ์ค‘์—์„œ ์ง‘ํ•ฉ S์— ์†ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ๋ช‡ ๊ฐœ์ธ์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • N๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง€๋ฉด ๊ทธ ๋ฌธ์ž์—ด์„ key๊ฐ’์œผ๋กœ 0์„ value๊ฐ’์œผ๋กœ ํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • M๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ์ฐจ๋ก€๋กœ ๋Œ๋ฉด์„œ ์ง‘ํ•ฉS์•ˆ์— ์กด์žฌํ•˜๋ฉด count ๊ฐ’์„ +1 ํ•ด์ค€๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ•ด์‹œํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ๋‚ด์šฉ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ๋‹จ์–ด๋ฅผ ๋ฐ”๋กœ ์ฐพ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ณผ์ •์€ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์ด๋‹ค.
import sys
input = sys.stdin.readline

n, m = map(int, input().split())

s = {}
count = 0

for i in range(n):
  str = input().rstrip()
  s[str] = 0

for i in range(m):
  problem = input().rstrip()
  if(problem in s):
    count += 1

print(count)

๐ŸŸก11279 ์ตœ๋Œ€ ํž™

์„ค๋ช…

  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํ™œ์šฉํ•ด ํ‘ธ๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • heapq๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ตœ์†Œ ํž™์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ’์„ ๋„ฃ์„ ๋•Œ - ๋ถ€ํ˜ธ๋ฅผ ๋ถ™์—ฌ ๋„ฃ์–ด ์ตœ๋Œ€ํž™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
import sys
import heapq
input = sys.stdin.readline

n = int(input())
heap = []

for i in range(n):
  num = int(input())
  if(num == 0):
    if(heap):
      print(-heapq.heappop(heap))
    else:
      print(0)
  else:
    heapq.heappush(heap, -num)

๐ŸŸก2075 N๋ฒˆ์งธ ํฐ ์ˆ˜

์„ค๋ช…

  • N×N์˜ ํ‘œ์— ์ฑ„์›Œ์ง„ ์ˆ˜๋“ค ์ค‘ N๋ฒˆ์งธ๋กœ ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. (ํŠน์ง• : ๋ชจ๋“  ์ˆ˜๋Š” ์ž์‹ ์˜ ํ•œ ์นธ ์œ„์— ์žˆ๋Š” ์ˆ˜๋ณด๋‹ค ํฌ๋‹ค)
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ์–ด N×N๊ฐœ์˜ ์ˆ˜๋ฅผ ๋‹ค ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋ก  ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • N๋ฒˆ์งธ๋กœ ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํฌ๊ธฐ๊ฐ€ N์ธ ์ตœ์†Œ ํž™์„ ์ด์šฉํ•˜์—ฌ ํ‘ผ๋‹ค.
    • ํž™์˜ ํฌ๊ธฐ๊ฐ€ N๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ
      • ํž™์— ์ˆ˜๋ฅผ pushํ•ด์ค€๋‹ค.
    • ํž™์˜ ํฌ๊ธฐ๊ฐ€ N๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๊ฒฝ์šฐ
      • ์ฃผ์–ด์ง„ ์ˆ˜๊ฐ€ ํ˜„์žฌ ํž™์—์„œ ์ œ์ผ ์ž‘์€ ์ˆ˜๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๊ทธ๋ƒฅ PASS
      • ์ฃผ์–ด์ง„ ์ˆ˜๊ฐ€ ํ˜„์žฌ ํž™์—์„œ ์ œ์ผ ์ž‘์€ ์ˆ˜๋ณด๋‹ค ํฌ๋‹ค๋ฉด popํ•˜๊ณ  ์ฃผ์–ด์ง„ ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
import sys
import heapq
input = sys.stdin.readline

n = int(input())

heap = []

for _ in range(n):
  for i in list(map(int, input().split())):
    if(len(heap) < n):
      heapq.heappush(heap, i)
    else:
      if(heap[0] < i):
        heapq.heappop(heap)
        heapq.heappush(heap, i)

print(heapq.heappop(heap))

๐ŸŸก21939 ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ Version 1

์กฐ๊ฑด๋“ค์ด ๊นŒ๋‹ค๋กœ์›Œ ๋งŽ์ด ํ‹€๋ ธ๋˜ ๋ฌธ์ œ์˜€๋‹ค. ๊ฒฐ๊ตญ "์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ์—†๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด์ „์— ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋˜ ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋‚œ์ด๋„๋กœ ๋‹ค์‹œ ๋“ค์–ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค" ๋ผ๋Š” ์กฐ๊ฑด์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ํ•ด๋‹น๋ถ€๋ถ„์€ ๊ตฌ๊ธ€๋ง์„ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋‹ค. ๐Ÿ’ฆ

 

ํ’€์ด ์„ค๋ช…

  • ๋ฌธ์ œ ๋ฒˆํ˜ธ, ๋‚œ์ด๋„๋ฅผ ๊ฐ€์ง„ ๋ฌธ์ œ๋“ค์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ช…๋ น์–ด์— ๋”ฐ๋ผ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜, ๊ฐ€์žฅ ์‰ฌ์šด ๋ฌธ์ œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋‚œ์ด๋„๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ๋œ ํž™, ๋‚œ์ด๋„๊ฐ€ ๋‚ฎ์€ ์ˆœ์œผ๋กœ ๋œ ํž™ ๋‘๊ฐœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ํ ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
  • ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํฌ์ธํŠธ๋Š” ๋‘ ํ๋ฅผ ์„œ๋กœ ๋™๊ธฐํ™” ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋‚˜๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ key๋กœ ๊ฐ€์ง€๊ณ  boolean๊ฐ’์„ value๋กœ ๊ฐ€์ง„ dict๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ฆฌ์ŠคํŠธ ๋‚ด์— ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ตฌ๋ถ„ํ•ด์ฃผ๊ณ , ์—†๋‹ค๋ฉด ์ทจ๊ธ‰ํ•ด์ฃผ์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋™๊ธฐํ™” ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ด ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด ์ค‘ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ์—†๋Š” ๋ฌธ์ œ ๋ฒˆํ˜ธ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด์ „์— ์ถ”์ฒœ ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋˜ ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋‚œ์ด๋„๋กœ ๋‹ค์‹œ ๋“ค์–ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ผ๋Š” ์กฐ๊ฑด์ด ์ข€ ์–ด๋ ค์› ๋Š”๋ฐ, ์ƒํ™ฉ์„ ๋”ฐ์ ธ ๋ณด์ž๋ฉด

10๋ฒˆ ๋ฌธ์ œ[โŒ]๋Š” heqp์—์„œ pop๋˜์—ˆ๊ฑฐ๋‚˜ "solved" ์ฒ˜๋ฆฌ๋˜์–ด ๋ฆฌ์ŠคํŠธ์— ์—†๋Š” ๋ฌธ์ œ, 10๋ฒˆ ๋ฌธ์ œ[โญ•]๋Š” ์ƒˆ๋กœ ๋“ค์–ด์™€ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๋ฌธ์ œ๋ผ๊ณ  ํ•˜์ž.

  • 10๋ฒˆ ๋ฌธ์ œ[โŒ]๊ฐ€ heqp์—์„œ pop๋˜์—ˆ๊ฑฐ๋‚˜ “solved” ์ฒ˜๋ฆฌ๋˜์–ด in_list[10] = False์ธ ์ƒํ™ฉ
  • 10๋ฒˆ ๋ฌธ์ œ[โญ•]๋ฅผ "add"ํ•˜๋ผ๋Š” ๋ช…๋ น์ด ๋“ค์–ด์˜ด
  • ์•„์ง in_list[10] = False์ผ ๋ฟ์ด์ง€ ์‹ค์ œ๋กœ heap๋‚ด์—๋Š” 10๋ฒˆ ๋ฌธ์ œ[โŒ]๊ฐ€ ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๊ทธ๋ƒฅ add๋ฅผ ํ•ด๋ฒ„๋ฆฌ๊ณ  in_list[10] = Ture๋กœ ๋ฐ”๊ฟ€ ๊ฒฝ์šฐ ์ดํ›„ ํ„ด์—์„œ 10๋ฒˆ ๋ฌธ์ œ[โŒ]๊ฐ€ ๋ฆฌํ„ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๊ฒฐ โžก๏ธ addํ•˜๊ธฐ ์ „์— heap์˜ top๋ถ€๋ถ„์— in_list[*] = False์ธ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋‹ค POPํ•ด์„œ ์—†์• ์ค€๋‹ค.

 

์ฝ”๋“œ ์„ค๋ช…

  • ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ๋ฌถ์–ด ๋ฉ”์ธ๋กœ์ง์„ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.
  1. addToBothHeap(problem, level) ํ•จ์ˆ˜
    • ๋ฌธ์ œ ๋ฒˆํ˜ธ์™€ ๋‚œ์ด๋„๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์–ด์ค€๋‹ค. ์ด๋•Œ in_list๋ฅผ True๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.
  2. popMaxHeapWhileTopInList() ํ•จ์ˆ˜
    • Max_Heap์˜ top์— ์žˆ๋Š” ์›์†Œ๊ฐ€ ๋ฆฌ์ŠคํŠธ ๋‚ด์— ์žˆ๋Š” ํ•จ์ˆ˜์ผ ๋•Œ๊นŒ์ง€ ๊ณ„์† popํ•ด์ค€๋‹ค.
  3. popMinHeapWhileTopInList() ํ•จ์ˆ˜
    • Min_Heap์˜ top์— ์žˆ๋Š” ์›์†Œ๊ฐ€ ๋ฆฌ์ŠคํŠธ ๋‚ด์— ์žˆ๋Š” ํ•จ์ˆ˜์ผ ๋•Œ๊นŒ์ง€ ๊ณ„์† popํ•ด์ค€๋‹ค.
import sys
import heapq
from collections import defaultdict
input = sys.stdin.readline

max_heap = []
min_heap = []
in_list = defaultdict(bool)

def addToBothHeap(problem, level):
  heapq.heappush(max_heap, (-level, -problem))
  heapq.heappush(min_heap, (level, problem))
  in_list[problem] = True

def popMaxHeapWhileTopInList():
  while(not in_list[-max_heap[0][1]]):
        heapq.heappop(max_heap)

def popMinHeapWhileTopInList():
  while(not in_list[min_heap[0][1]]):
        heapq.heappop(min_heap)

n = int(input())
  
for i in range(n):
  problem, level = map(int, input().split())
  addToBothHeap(problem, level)

m = int(input())

for i in range(m):
  operation = input().split()
  if(operation[0] == "recommend"):
    if(operation[1] == '1'):
      popMaxHeapWhileTopInList()
      print(-max_heap[0][1])
    else:
      popMinHeapWhileTopInList()
      print(min_heap[0][1])
  elif(operation[0] == "add"):
    popMaxHeapWhileTopInList()
    popMinHeapWhileTopInList()
    problem, level = int(operation[1]), int(operation[2])
    addToBothHeap(problem, level)
  elif(operation[0] == "solved"):
    problemNum = int(operation[1])
    in_list[problemNum] = False