1 minute read


문제 유형 : 정렬, 이분탐색


문제

  • N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

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


제한사항

  • 입력

    첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.

  • 출력

    M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.


  • x in a : 시간 복잡도 O(n)

    x 값이 list a에 있는지 확인하는 연산 입니다. x가 있는지확인하기 위해 리스트 a를 전체 탐색 해야 하므로 시간의 복잡도가 n 입니다.

    출처: https://hyun-am-coding.tistory.com/entry/Python-list-연산에-따른-시간-복잡도 [현암 코딩]

    => **따라서 in말고 다른 방법을 사용해야한다. **

    시간초과가 난 코드

    n = int(input())
    aList = list(map(int,input().split(" ")))
    m = int(input())
    presentList = list(map(int,input().split(" ")))
    for x in presentList:
        if x in aList:
            print(1)
        else:
            print(0)
    
  • 이분탐색을 이용

    • start = mid+1, end= mid end를 이렇게 해야하는 이유가 뭘까
    • index를 사용한거라서 그런가?

solution

n = int(input())
aList = list(map(int,input().split(" ")))
m = int(input())
presentList = list(map(int,input().split(" ")))
aList.sort()
def binary(arr,x):
    start = 0
    end = len(arr)
    while start < end:
        mid = (start + end) //2
        if arr[mid] == x:
            return True
        elif arr[mid] > x:
            end = mid
        else:
            start = mid +1
    return False

for x in presentList:
    print("1" if binary(aList,x) else "0")
나의 한마디

이건 좀 헷갈린다… 나중에 한번 더 봐야지