๋ถ€ํ’ˆ ์ฐพ๊ธฐ(Python) - ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค

2020. 8. 28. 16:45ใ†์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค/ํƒ์ƒ‰

๋ถ€ํ’ˆ ์ฐพ๊ธฐ(Python) - ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค

 

 

 

๋ฌธ์ œ : ๋™๋นˆ์ด๋„ค ์ „์ž ๋งค์žฅ์—๋Š” ๋ถ€ํ’ˆ์ด N๊ฐœ ์žˆ๋‹ค. ๊ฐ ๋ถ€ํ’ˆ์€ ์ •์ˆ˜ ํ˜•ํƒœ์˜ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋‹ค. ์–ด๋Š ๋‚  ์†๋‹˜์ด M๊ฐœ์ข…๋ฅ˜์˜ ๋ถ€ํ’ˆ์„ ๋Œ€๋Ÿ‰์œผ๋กœ ๊ตฌ๋งคํ•˜๊ฒ ๋‹ค๋ฉฐ ๋‹น์ผ ๋‚  ๊ฒฌ์ ์„œ๋ฅผ ์š”์ฒญํ–ˆ๋‹ค. ๋™๋นˆ์ด๋Š” ๋•Œ๋ฅผ ๋†“์น˜์ง€ ์•Š๊ณ  ์†๋‹˜์ด ๋ฌธ์˜ํ•œ ๋ถ€ํ’ˆ M๊ฐœ ์ข…๋ฅ˜๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์„œ ๊ฒฌ์ ์„œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ๊ฐ€๊ฒŒ ์•ˆ์— ๋ถ€ํ’ˆ์ด ๋ชจ๋‘ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€๊ฒŒ์˜ ๋ถ€ํ’ˆ์ด ์ด 5๊ฐœ์ผ ๋•Œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž.

 

N = 5

[8, 3, 7, 9, 2]

 

์†๋‹˜์€ ์ด 3๊ฐœ์˜ ๋ถ€ํ’ˆ์ด ์žˆ๋Š”์ง€ ํ™•์ธ ์š”์ฒญํ–ˆ๋Š”๋ฐ ๋ถ€ํ’ˆ๋ฒˆํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

M = 3

[5, 7, 9]

์ด๋•Œ ์†๋‹˜์ด ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ถ€ํ’ˆ์„ ํ™•์ธํ•ด ๋ถ€ํ’ˆ์ด ์žˆ์œผ๋ฉด yes๋ฅผ, ์—†์œผ๋ฉด no๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ตฌ๋ถ„์€ ๊ณต๋ฐฑ์œผ๋กœ ํ•œ๋‹ค.

 

์ž…๋ ฅ์กฐ๊ฑด

  • ์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1<=N<=1,000,000)
  • ๋‘˜์งธ ์ค„์—๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ ์ •์ˆ˜๋Š” 1๋ณด๋‹ค ํฌ๊ณ  1,000,000 ์ดํ•˜์ด๋‹ค.
  • ์…‹์งธ ์ค„์—๋Š” ์ •์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค.
  • ๋„ท์งธ ์ค„์—๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ M๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ ์ •์ˆ˜๋Š” 1๋ณด๋‹ค ํฌ๊ณ  10์–ต ์ดํ•˜์ด๋‹ค.

์ถœ๋ ฅ์กฐ๊ฑด

  • ์ฒซ์งธ ์ค„์— ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ฐ ๋ถ€ํ’ˆ์ด ์กด์žฌํ•˜๋ฉด yes๋ฅผ, ์—†์œผ๋ฉด no๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• 

1. ์ž…๋ ฅ๊ฐ’์ด N๊ฐœ -> 100๋งŒ๊ฐœ , M๊ฐœ ->10๋งŒ๊ฐœ, ๋ฐ์ดํ„ฐ์˜ ๋ฒ”์œ„๋Š” 10์–ต์ดํ•˜์ด๋‹ค.

2. M๊ฐœ์˜ ๋ฐฐ์—ด์—์„œ target์„ ๊ฐ€์ ธ์˜ค๊ณ , ์ด๋ฅผ ์ด์ง„ํƒ์ƒ‰์— ๋„ฃ๋Š”๋‹ค.

3. ์ฐพ์œผ๋ฉด yes๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ชป์ฐพ์œผ๋ฉด no๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

def binary_search(array, target, start, end):
  if start > end :
    return None
  mid = (start+end)//2

  if array[mid] == target :
    return mid
  elif array[mid] > target :
    return binary_search(array, target, start ,mid-1)
  else :
    return binary_search(array, target, mid+1, end)


n= int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))


a.sort()

for i in range(m):
  target = b[i]
  result = binary_search(a, target, 0, n-1)
  if result == None:
    print("No", end = ' ')
  else :
    print("Yes", end = ' ')

 ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๊ฐœ๋…

1. sortํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•  ๋•Œ๋Š” a = a.sort()๊ฐ€ ์•„๋‹Œ a.sort()๋กœ ํ•ด์•ผํ•œ๋‹ค.

2. print()์•ˆ์— ๋ณ€์ˆ˜๋ฅผ ์ผ์„ ๋•Œ๋Š” ๋’ค์— , ์—†์ด end = ' '๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋Š”๋ฐ, ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด ,์„ ๋ถ™์—ฌ์ฃผ๋„๋ก ํ•˜์ž.

 

๋ฌธ์ œ ํ•ด์„ค

- ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ 100,000๊ฐœ์™€ 1,000,000๊ฐœ ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์•„ ์ˆœ์ฐจํƒ์ƒ‰์œผ๋กœ ๊ณ„์‚ฐ์„ ํ•œ๋‹ค๋ฉด ์ตœ๋Œ€ 1,000,000 X 100,000์˜ ์—ฐ์‚ฐํšŸ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” 1000์–ต์— ๊ฐ€๊นŒ์šด ์ˆ˜์ด๋ฏ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰์€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

- ๋‹ค์Œ์œผ๋กœ ์ƒ๊ฐํ•œ ๊ฑด ์ด์ง„ ํƒ์ƒ‰์ด๋‹ค. ์ด์ง„ ํƒ์ƒ‰์€ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ์ˆซ์ž์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € a์˜ ๋ฐฐ์—ด์„ sort๋กœ ์ •๋ ฌ์„ ํ•ด์ค€๋‹ค. ์ด๋Š” ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋”ฐ๋ฅด๊ธฐ์— O(NlogN)์ด๋‹ค. ์ด ์ˆซ์ž๋Š” ์•ฝ 2,000๋งŒ์— ๊ฐ€๊นŒ์šด ์ˆ˜๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  100,000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ ธ์™€์„œ ์ด์ง„ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด logN๋งŒํผ ํ•˜๊ธฐ์— ์ด๋Š” O(MlogN)์ด ๋“ ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์ˆ˜์ •๋ ฌ์„ ์ด์šฉํ•ด์„œ๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” N๊ฐœ ๊ฐ๊ฐ์˜ ๊ฐ’์ด 1๋ถ€ํ„ฐ 100๋งŒ ์‚ฌ์ด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

- 1,000,000๊ฐœ์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ ๋’ค 0์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚ค๊ณ , N๊ฐœ์˜ ๋ฐฐ์—ด์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’๋งŒ count๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

- m๊ฐœ์™€ b๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

- b ๋ฐฐ์—ด์—์„œ ํ•˜๋‚˜์”ฉ ๋นผ์™€์„œ ์ด๋ฅผ a์—์„œ ์ธ๋ฑ์Šค๋กœ ์ทจ๊ธ‰ํ•ด ๊ฐ’์ด 1 ์ด ๋‚˜์˜จ๋‹ค๋ฉด yes ์•„๋‹ˆ๋ผ๋ฉด no๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•œ๋‹ค.

 

n = int(input())

a = [0] * 1000000

for i in input().split():
  a[int(i)] = 1
  
m = int(input())
x = list(map(int,input().split()))

for i in x :
  if a[i] == 1 :
    print('yes', end = ' ')
  else :
    print('no', end =' ')
    
    




 

๊ณ„์ˆ˜์ •๋ ฌ์€ ์ฒ˜์Œ์— 1,000,000๋งŒํผ์˜ ์ดˆ๊ธฐํ™”, x๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ’ 100,000๋งŒํผ๋งŒ ์ˆ˜ํ–‰์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์œ„์˜ ์ด์ง„ํƒ์ƒ‰๋ณด๋‹ค ๋”์šฑ๋” ํšจ๊ณผ์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž…๋ ฅ๊ณผ ๋™์‹œ์— ๋ฐ”๋กœ ๋ณ€์ˆ˜๋กœ ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— range(๊ฐœ์ˆ˜)ํ•˜๊ณ  ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ์ผ์ด ๋”ฑํžˆ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด์— ๋นจ๋ฆฌ ์ต์ˆ™ํ•ด์ ธ์•ผ๊ฒ ๋‹ค. 

 

for i in input().split() ๊ณผ for i in ๋ฐฐ์—ด์€ ์ฒดํ™” ์‹œํ‚ค๋Š” ๊ฒŒ ์ข‹์„ ๋“ฏํ•˜๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ set()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋ฅผ ์‚ดํŽด๋ณด์ž

n = int(input())
array = set(map(int,input().split()))

m = int(input())

x = list(map(int, input().split()))

for i in x :
  if i in array:
    print('yes', end = ' ')
  else :
    print('no', end =' ')

if i in array๋Š” ์ง‘ํ•ฉ ์ž๋ฃŒํ˜•์ผ ๋•Œ ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ํŠน์ •ํ•œ ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํšจ์œจ์ ์œผ๋กœ ๋ณด์ธ๋‹ค.