개발자일걸요..?

1920번 수 찾기 본문

알고리즘코딩/Baekjoon Online Judge

1920번 수 찾기

Re_A 2021. 2. 28. 20:56
728x90
반응형

문제링크 : 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) 숫자배열, 찾고자 하는 수의 배열 입력받기

  2) 처음 주어진 숫자 배열만 정렬(정렬함수가 제일 시간복잡도가 작음) 

  3) 찾고자 하는 수의 배열의 수 만큼 함수를 돌리면서 존재여부 확인

     3-1) 처음 주어진 숫자배열의 경계 밖의 숫자인지 확인 

     3-2) 처음 주어진 숫자배열의 경계의 숫자인지 확인 

     3-3) 위의 경우가 모두 아니라면 재귀함수를 이용해 이분탐색 적용

 

 

이분 탐색 -> 배열의 처음과 끝을 left와 right로 정한 후, target을 mid값((left+right)//2)과 비교해 왼쪽 분할에서 다시 찾을지 오른쪽 분할에서 다시 찾을지를 적용하여 반복

 

+) 참고 : wootool.tistory.com/62

 

[알고리즘] 이분 탐색

이분 탐색  탐색 기법중에 하나로 원하는 탐색범위를 두 부분으로 분할해서 찾는 방식입니다. 그렇기에 원래의 전부를 탐색하는 탐색 속도에 비해 빠릅니다. 이분 탐색을 하는 방법은 left , right

wootool.tistory.com

 

 

 

 

메모리 : 44736KB    시간 : 772ms

def isIt(numbers, left, right, mid, wantfind):
    if(numbers[mid]<wantfind):
        if(left==mid or mid == right):
            return 0
        return isIt(numbers,mid,right,(mid+right)//2,wantfind)
    elif(numbers[mid]>wantfind):
        if (left == mid or mid == right):
            return 0
        return isIt(numbers, left,mid,(left+mid)//2,wantfind)
    elif(numbers[mid]==wantfind):
        return 1
import sys
M = int(sys.stdin.readline())
numbers= list(map(int,sys.stdin.readline().split()))
numbers = sorted(numbers)

N = int(sys.stdin.readline())
target = list(map(int,sys.stdin.readline().split()))

#targe N개의 존재여부를 찾음
for i in range(0,N):
    #아예 범위 안에 없는 수인지 확인
    if(numbers[0]>target[i] or numbers[M-1]<target[i]):
        print(0)
    #경계 선 확인
    elif (numbers[0]==target[i] or numbers[M-1]==target[i]):
        print(1)
    #경계선 안 확인
    else:
        print(isIt(numbers, 0,M-1,M//2,target[i]))
반응형

'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글

2630번 색종이 만들기  (0) 2021.03.01
10816번 숫자카드2  (0) 2021.02.28
5430번 AC  (0) 2021.02.27
1021번 회전하는 큐  (0) 2021.02.26
10866번 덱  (0) 2021.02.26
Comments