Algorithm/BOJ

[BOJ] 1920번 수찾기 / 이뢄탐색 / ν•΄μ‹œν…Œμ΄λΈ”

hello_u 2023. 8. 7. 12:04

 

 

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

 

1920번: 수 찾기

첫째 쀄에 μžμ—°μˆ˜ N(1 ≤ N ≤ 100,000)이 주어진닀. λ‹€μŒ μ€„μ—λŠ” N개의 μ •μˆ˜ A[1], A[2], …, A[N]이 주어진닀. λ‹€μŒ μ€„μ—λŠ” M(1 ≤ M ≤ 100,000)이 주어진닀. λ‹€μŒ μ€„μ—λŠ” M개의 μˆ˜λ“€μ΄ μ£Όμ–΄μ§€λŠ”λ°, 이 μˆ˜λ“€

www.acmicpc.net

 

 

수 μ°ΎκΈ° μ„±κ³΅

 
μ‹œκ°„ μ œν•œλ©”λͺ¨λ¦¬ μ œν•œμ œμΆœμ •λ‹΅λ§žνžŒ μ‚¬λžŒμ •λ‹΅ λΉ„μœ¨
1 초 128 MB 217313 66856 44340 30.018%

문제

N개의 μ •μˆ˜ A[1], A[2], …, A[N]이 μ£Όμ–΄μ Έ μžˆμ„ λ•Œ, 이 μ•ˆμ— XλΌλŠ” μ •μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μžμ—°μˆ˜ N(1 ≤ N ≤ 100,000)이 주어진닀. λ‹€μŒ μ€„μ—λŠ” N개의 μ •μˆ˜ A[1], A[2], …, A[N]이 주어진닀. λ‹€μŒ μ€„μ—λŠ” M(1 ≤ M ≤ 100,000)이 주어진닀. λ‹€μŒ μ€„μ—λŠ” M개의 μˆ˜λ“€μ΄ μ£Όμ–΄μ§€λŠ”λ°, 이 μˆ˜λ“€μ΄ Aμ•ˆμ— μ‘΄μž¬ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄λ©΄ λœλ‹€. λͺ¨λ“  μ •μˆ˜μ˜ λ²”μœ„λŠ” -231 λ³΄λ‹€ ν¬κ±°λ‚˜ κ°™κ³  231보닀 μž‘λ‹€.

좜λ ₯

M개의 쀄에 닡을 좜λ ₯ν•œλ‹€. μ‘΄μž¬ν•˜λ©΄ 1을, μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 

5
4 1 5 2 3
5
1 3 7 9 5

예제 좜λ ₯ 1 

1
1
0
0
1

 

 

 


 

첫번째 제좜 

n = int(input())
arr = list(map(int,input().split()))
m = int(input())
arrM = list(map(int,input().split()))

arr.sort()
max_size = arr.pop()
for x in arrM:
  if x <= max_size:
    print(1)
  else:
    print(0)

 

문제λ₯Ό 잘λͺ» μ΄ν•΄ν–ˆλ‹€.

μž…λ ₯받은 N개의 μ •μˆ˜κ°€ 1~N κΉŒμ§€μ˜ 수인데 μˆœμ„œλ§Œ μ„žμΈ μž…λ ₯인 쀄 μ•Œμ•˜λ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§Œ 보고 λ‚΄λ©‹λŒ€λ‘œ ν•΄μ„ν•˜κΈ°,,

 

 

 

λ‘λ²ˆμ§Έ 제좜 

n = int(input())
arr = list(map(int,input().split()))
m = int(input())
arrM = list(map(int,input().split()))


for x in arrM:
    if x in arr:
        print(1)
    else:
        print(0)

μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ˜¬κ±Έ μ•Œμ•˜μ§€λ§Œ 일단 μ‹œλ„ν•΄λ΄€λ‹€.

 

μ •ν™•νžˆ μ–΄λ–€ 이유둜 μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜λŠ”μ§€ λͺ¨λ₯΄κ³ 

ν•΄κ²°ν•˜λ €λ©΄ μ–΄λ–€κ±Έ μ΄μš©ν•΄μ•Όν•˜λŠ”μ§€ λͺ¨λ₯΄λ‹ˆκΉŒ  κ³΅λΆ€ν•΄λ³΄μž.

 

List μ—μ„œ in μ—°μ‚°μž μ„±λŠ₯

list 의 값이 컀진닀면 , in μ—°μ‚°μžλŠ” 값을 λ‹€ ν•˜λ‚˜ν•˜λ‚˜ μŠ€μΊ” ν•œλ‹€μŒ 결과값을 λ°˜ν™˜ν•˜κΈ°λ•Œλ¬Έμ— μ˜€λž˜κ±Έλ¦°λ‹€. O(n) 

import time
a = list(range(1, 10000001))

start1 = time.time()
print(1 in a) # 첫번째 κ°’
end1 = time.time()

start2 = time.time()
print(10000000 in a) # λ§ˆμ§€λ§‰ κ°’
end2 = time.time()

print(end1-start1)
print(end2-start2)


# 좜λ ₯ 
# True
# True
# 0.0012135505676269531
# 0.2061300277709961

 

맨 λ§ˆμ§€λ§‰ 값을 κ²€μƒ‰ν–ˆμ„ λ•ŒλŠ” μ²˜μŒλΆ€ν„° λκΉŒμ§€ 10,000,000λ²ˆμ„ κ²€μ‚¬ν•œλ‹€. 

 

 

 

μ„Έλ²ˆμ§Έ 제좜

n = int(input())
arr = set(map(int,input().split()))
m = int(input())
arrM = list(map(int,input().split()))

for x in arrM:
    if x in arr:
        print(1)
    else:
        print(0)

 

set 자료ꡬ쑰

- Mutable μžλ£Œν˜• (λ³€κ²½κ°€λŠ₯ν•œ 객체)

값이 변경이 일어날떄 객체의 값이 λ³€κ²½

- 쀑볡X 

- μ •λ ¬X , μˆœμ„œκ°€ μ—†μŒ

- μ„ μ–Έ  a = set() 

 

Set μ—μ„œ in μ—°μ‚°μž μ„±λŠ₯

μ‹œκ°„λ³΅μž‘λ„ O(1)

Set도 μžμ‹ μ΄ 가지고 μžˆλŠ” μ›μ†Œλ“€μ€ 뭐가 μžˆλŠ”μ§€ 찾아봐야 ν•  텐데… μ–΄λ–»κ²Œ Setμ—μ„œμ˜ 자료 검색은 μƒμˆ˜μ‹œκ°„μ΄ λ˜λŠ”κ±ΈκΉŒ?

 

 

ν•΄μ‹œ ν…Œμ΄λΈ”

  • (Key, Value)둜 데이터λ₯Ό μ €μž₯ν•˜λŠ” 자료ꡬ쑰 쀑 ν•˜λ‚˜
  • λΉ λ₯΄κ²Œ 데이터λ₯Ό 검색할 수 μžˆλ‹€

ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ λΉ λ₯Έ 검색속도λ₯Ό μ œκ³΅ν•˜λŠ” 이유? 

  • λ‚΄λΆ€μ μœΌλ‘œ λ°°μ—΄(버킷)을 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•˜κΈ° λ•Œλ¬Έ
  • 버킷(bucket)μ΄λž€?
  • ν•΄μ‹œ ν…Œμ΄λΈ”μ€ 각각의 Key값에 ν•΄μ‹œν•¨μˆ˜λ₯Ό μ μš©ν•΄ λ°°μ—΄μ˜ κ³ μœ ν•œ indexλ₯Ό μƒμ„±ν•˜κ³ , 이 indexλ₯Ό ν™œμš©ν•΄ 값을 μ €μž₯ν•˜κ±°λ‚˜ κ²€μƒ‰ν•˜κ²Œ λœλ‹€. μ—¬κΈ°μ„œ μ‹€μ œ 값이 μ €μž₯λ˜λŠ” μž₯μ†Œλ₯Ό 버킷 λ˜λŠ” 슬둯이라고 ν•œλ‹€.

 

 

μΆ”κ°€ 제좜 

n = int(input())
arr = list(map(int,input().split()))
arr.sort()
m = int(input())
arrM = list(map(int,input().split()))

def binary(target):
    left = 0
    right = n-1 
    
    while left<=right:
        mid = (left+right)//2
        
        if arr[mid] == target:
            return True
        
        if arr[mid] < target:
            left = mid + 1 
        elif arr[mid] > target:
            right = mid - 1

for x in arrM:
    if binary(x):
        print(1)
    else:
        print(0)

 

이뢄 탐색

이진 νƒμƒ‰μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(logN)

μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ λ°°μ—΄μ—μ„œ μ›ν•˜λŠ” 숫자(target)을 μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜