본문 바로가기

Python/코딩테스트

[백준] 1920. 수찾기

백준 1920. 수찾기

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

난이도 : 실버 4

 

✓ 문제풀이 : 이분탐색

조건에서 정수의 수가 100,000으로 주어졌기 때문에 O(NlogN) 정도의 시간복잡도가 요구된다.

이분탐색 알고리즘의 경우 시간복잡도가 O(logN)이므로 해당 조건을 만족할 수 있다.

 

import sys
import time
input = sys.stdin.readline

n = int(input())
arr = list(map(int, input().split()))   #주어진 수
m = int(input())
chk = list(map(int, input().split()))   #확인할 수 

arr.sort()

for c in chk:
    s, e = 0, n-1
    ans = 0
    while s <= e:
        mid = (s+e)//2
        if arr[mid] == c:   # 존재 하는 경우
            ans = 1
            break
        elif arr[mid] < c:  # 주어진 수보다 작은 경우
            s = mid+1
        elif arr[mid] > c:  # 주어진 수보다 큰 경우
            e = mid-1
    
    print(ans)

 

 

 

+

이분탐색이 아닌 파이썬의 내장 함수를 사용해보기로 했다.

파이썬의 set의 경우는 존재 여부를 확인하는데 O(1)의 시간복잡도를 가지기 때문에 리스트를 set으로 변경시킨 후 존재 여부를 확인했다.

import sys
input = sys.stdin.readline

n = int(input())
num = list(map(int, input().split()))
m = int(input())
chk = list(map(int, input().split()))
num = set(num)

for x in chk:
    if x in num:
        print(1)
    else:
        print(0)

 

이분탐색의 경우 메모리는 47276KB, 시간은 744ms가 소요됐지만, 

내장함수를 사용한 경우 메모리는 50180KB, 시간은 172ms로 시간이 훨씬 단축된 것을 알 수 있었다.

문제 유형과 조건에 따라 적절한 방법을 사용하면 좋을 것 같다.

'Python > 코딩테스트' 카테고리의 다른 글

[백준] 10815. 숫자 카드  (1) 2023.10.09
[백준] 10816. 숫자 카드 2  (0) 2023.10.09
[백준] 2330번 : 수 고르기  (1) 2023.09.23
[백준] 구현 기초 - 별 찍기 1~7  (0) 2023.09.21
[프로그래머스] 합성수 찾기  (0) 2023.05.31