[Python] S4_2776_μ•”κΈ°μ™• πŸ‘‘

Sangho HanΒ·2023λ…„ 6μ›” 14일
post-thumbnail

https://www.acmicpc.net/problem/2776

문제

μ—°μ’…μ΄λŠ” μ—„μ²­λ‚œ κΈ°μ–΅λ ₯을 κ°€μ§€κ³  μžˆλ‹€. κ·Έλž˜μ„œ ν•˜λ£¨ λ™μ•ˆ λ³Έ μ •μˆ˜λ“€μ„ λͺ¨λ‘ κΈ°μ–΅ ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ 이λ₯Ό 믿을 수 μ—†λŠ” λ™κ·œλŠ” 그의 κΈ°μ–΅λ ₯을 μ‹œν—˜ν•΄ 보기둜 ν•œλ‹€. λ™κ·œλŠ” 연쒅을 따라 λ‹€λ‹ˆλ©°, 연쒅이 ν•˜λ£¨ λ™μ•ˆ λ³Έ μ •μˆ˜λ“€μ„ λͺ¨λ‘ β€˜μˆ˜μ²©1’에 적어 λ†“μ•˜λ‹€. 그것을 λ°”νƒ•μœΌλ‘œ κ·Έκ°€ μ§„μ§œ 암기왕인지 μ•Œμ•„λ³΄κΈ° μœ„ν•΄, λ™κ·œλŠ” μ—°μ’…μ—κ²Œ M개의 μ§ˆλ¬Έμ„ λ˜μ‘Œλ‹€. 질문의 λ‚΄μš©μ€ β€œXλΌλŠ” μ •μˆ˜λ₯Ό 였늘 λ³Έ 적이 μžˆλŠ”κ°€?” 이닀. 연쒅은 λ§‰νž˜μ—†μ΄ λͺ¨λ‘ λŒ€λ‹΅μ„ ν–ˆκ³ , λ™κ·œλŠ” 연쒅이 λ΄€λ‹€κ³  μ£Όμž₯ν•˜λŠ” 수 듀을 β€˜μˆ˜μ²©2’에 적어 λ‘μ—ˆλ‹€. 집에 λŒμ•„μ˜¨ λ™κ·œλŠ” 닡이 λ§žλŠ”μ§€ ν™•μΈν•˜λ € ν•˜μ§€λ§Œ, 연쒅을 λ”°λΌλ‹€λ‹ˆλŠλΌ λ„ˆλ¬΄ νž˜λ“€μ–΄μ„œ μ—¬λŸ¬λΆ„μ—κ²Œ 도움을 μš”μ²­ν–ˆλ‹€. λ™κ·œλ₯Ό 도와주기 μœ„ν•΄ β€˜μˆ˜μ²©2’에 μ ν˜€μžˆλŠ” μˆœμ„œλŒ€λ‘œ, 각각의 μˆ˜μ— λŒ€ν•˜μ—¬, β€˜μˆ˜μ²©1’에 있으면 1을, μ—†μœΌλ©΄ 0을 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λ³΄μž.

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ 개수 Tκ°€ λ“€μ–΄μ˜¨λ‹€. λ‹€μŒ μ€„μ—λŠ” β€˜μˆ˜μ²© 1’에 적어 놓은 μ •μˆ˜μ˜ 개수 N(1 ≀ N ≀ 1,000,000)이 μž…λ ₯으둜 λ“€μ–΄μ˜¨λ‹€. κ·Έ λ‹€μŒ 쀄에 β€˜μˆ˜μ²© 1’에 μ ν˜€ μžˆλŠ” μ •μˆ˜λ“€μ΄ N개 λ“€μ–΄μ˜¨λ‹€. κ·Έ λ‹€μŒ μ€„μ—λŠ” β€˜μˆ˜μ²© 2’에 적어 놓은 μ •μˆ˜μ˜ 개수 M(1 ≀ M ≀ 1,000,000) 이 μ£Όμ–΄μ§€κ³ , λ‹€μŒ 쀄에 β€˜μˆ˜μ²© 2’에 적어 놓은 μ •μˆ˜λ“€μ΄ μž…λ ₯으둜 M개 λ“€μ–΄μ˜¨λ‹€. λͺ¨λ“  μ •μˆ˜λ“€μ˜ λ²”μœ„λŠ” int 둜 ν•œλ‹€.

좜λ ₯

β€˜μˆ˜μ²©2’에 μ ν˜€μžˆλŠ” M개의 숫자 μˆœμ„œλŒ€λ‘œ, β€˜μˆ˜μ²©1’에 있으면 1을, μ—†μœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

예제

쑰건

  • μ‹œκ°„ μ œν•œ: 2초
  • λ©”λͺ¨λ¦¬ μ œν•œ: 256MB

import sys
input = sys.stdin.readline

# Binary Search
def BS(goal):
    start,end = 0,len(lst1)-1
    
    while start <= end:
        i = (start+end)//2
        num = lst1[i]
        if num == goal:
            return 1
        elif num > goal:
            end = (i-1)
        else:  
            start = (i+1)
            
    return 0

T = int(input())
for _ in range(T):
    N = int(input())
    lst1 = sorted(list(map(int,input().split())))
    M = int(input())
    lst2 = list(map(int,input().split()))
    
    for i in lst2:
        print(BS(i))
        
  1. lst1 을 μ •λ ¬ν•œ 후에, lst2 의 μ›μ†Œλ“€λ‘œ 이뢄 탐색 을 μ‹€ν–‰ν•œλ‹€.
  1. i λ₯Ό 탐색할 인덱슀둜 μ •ν•˜κ³ , λ§Œμ•½ μ°ΎλŠ” goal 이 λ‚˜μ˜€κ²Œ 되면 1 을 return ν•œλ‹€.
  1. λͺ¨λ“  탐색을 μ™„λ£Œν–ˆλŠ”λ°λ„ μ°Ύμ§€ λͺ»ν•˜λ©΄, 0 을 return ν•œλ‹€.

λŠλ‚€ 점 & 배운 점

  1. 이뢄 탐색을 ν™œμš©ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€. μ–΄λ– ν•œ 숫자λ₯Ό νƒμƒ‰ν•˜λŠ” κ³Όμ •μ—μ„œλŠ” 이뢄 탐색이 μœ μš©ν•œ 것 κ°™λ‹€!
profile
λΈ”λ‘œκ·Έ μ΄κ΄€ν•˜μ˜€μŠ΅λ‹ˆλ‹€: https://bbbang105.github.io/

0개의 λŒ“κΈ€