마음만 바쁜 사람
article thumbnail
Published 2022. 4. 30. 23:52
10815-숫자카드 ALGORITHM/BOJ

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

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

이분 탐색을 공부하는 중 대표 문제로 지정되어 있어서 들어가 봤더니 이전에 다른 방식으로 해결한 문제였다. 이번엔 이분 탐색을 사용하여 풀어 보았다. 

파이썬 이분 탐색 라이브러리: from bisect import bisect_left, bisect_right

이를 이용해서 리스트에 자신이 찾길 원하는 숫자가 존재하는지 확인할 수 있다..!

bisect_right(arr, i) - bisect_left(arr, i) == 정렬된 리스트 arr에서 i의 개수

 

from bisect import bisect_left, bisect_right
import sys
input = sys.stdin.readline
N = int(input())
have = list(map(int,input().split()))
M = int(input())
find = list(map(int,input().split()))

have.sort()

def is_possible(mid):
    return mid <= max(have)

for i in find:
    lo = bisect_left(have, i)
    hi = bisect_right(have, i)
    if hi - lo == 1:
        print(1, end=' ')
    else:
        print(0, end=' ')

 

하지만 이 문제의 경우 굳이 이분탐색을 사용할 필요는 없다. 이전에 작성했던 코드는 파이썬의 딕셔너리를 활용했는데 딕셔너리 안에서 특정 값을 찾는 연산속도는 O(1)이기 때문에 이분탐색의 O(logN)보다 더 빠르다..

import sys
input = sys.stdin.readline
N = int(input())
cards = list(map(int,input().split()))
check = {}
for i in cards:
    check[i] = 1 

M = int(input())
numbers = list(map(int,input().split()))

for i in numbers:
    if i in check:
        print(1, end=' ')
    else:
        print(0, end=' ')

위는 딕셔너리 사용 코드, 아래는 이분 탐색 코드

 

'ALGORITHM > BOJ' 카테고리의 다른 글

1654-랜선 자르기  (0) 2022.05.02
2805-나무 자르기  (0) 2022.05.02
2512-예산  (0) 2022.04.29
14502-연구소  (2) 2022.04.27
16946-벽 부수고 이동하기 4  (0) 2022.04.26
profile

마음만 바쁜 사람

@훌루훌루

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!